delete method

Future<void> delete(
  1. String id
)

Deleta fisicamente a linha baseada no ID

Implementation

Future<void> delete(String id) async {
  final rows = await getRawRows(forceRefresh: true);
  if (rows.isEmpty) return;

  int rowIndex = rows.indexWhere(
    (row) => row.isNotEmpty && row[0].toString() == id,
  );
  if (rowIndex == -1) return;

  final gid = await getGid();

  // Pega os índices da cascata
  final cascadeIndices = await GoogleSheetsDatabase()
      .buildCascadeDeleteIndices(sheetName, [id]);

  // Adiciona o próprio índice
  cascadeIndices.putIfAbsent(gid, () => {}).add(rowIndex);

  // Constrói os requests garantindo unicidade e ordem decrescente
  final List<sheets.Request> requests = [];
  cascadeIndices.forEach((sheetId, indices) {
    final sortedIndices = indices.toList()..sort((a, b) => b.compareTo(a));
    for (final index in sortedIndices) {
      requests.add(
        sheets.Request(
          deleteDimension: sheets.DeleteDimensionRequest(
            range: sheets.DimensionRange(
              sheetId: sheetId,
              dimension: "ROWS",
              startIndex: index,
              endIndex: index + 1,
            ),
          ),
        ),
      );
    }
  });

  await api.spreadsheets.batchUpdate(
    sheets.BatchUpdateSpreadsheetRequest(requests: requests),
    spreadsheetId,
  );

  // Como a deleção pode ter apagado a linha 2 (que contém as fórmulas ARRAYFORMULA),
  // nós reaplicamos as fórmulas para garantir que a planilha continue funcionando.
  await GoogleSheetsDatabase().reapplyFormulas();

  _cachedRawRows = null; // Invalida o cache local
}