newLstMap static method

List<Map<String, dynamic>> newLstMap({
  1. required Map<String, dynamic> esquema,
  2. required List dataOriginal,
  3. required List dataActualizado,
  4. List<String>? lstKeyExcluir,
  5. List<String>? lstKeyMantener,
  6. List<String>? lstPrefijosExcluir,
})

Retorna la lista de diferencias entre dataOriginal y dataActualizado, teniendo en cuenta el esquema y las reglas de exclusión/mantenimiento.

Implementation

static List<Map<String, dynamic>> newLstMap({
  required Map<String, dynamic> esquema,
  required List<dynamic> dataOriginal,
  required List<dynamic> dataActualizado,
  List<String>? lstKeyExcluir,
  List<String>? lstKeyMantener,
  List<String>? lstPrefijosExcluir,
}) {
  final List<Map<String, dynamic>> diferencias = [];

  // Verifica que dataActualizado sea una lista de Map
  if (!esUnaListaDeMapas(dataActualizado)) {
    FlutterUtilsProvider.logDebug(
      'error: dataActualizado no es una lista de mapas válida: $dataActualizado',
    );
    return diferencias;
  }

  // Verifica que dataOriginal, si no está vacía, sea una lista de Map
  if (dataOriginal.isNotEmpty && !esUnaListaDeMapas(dataOriginal)) {
    FlutterUtilsProvider.logDebug(
      'error: dataOriginal no es una lista de mapas válida: $dataOriginal',
    );
    return diferencias;
  }

  for (final itemDataActualizada in dataActualizado) {
    final String idValue = itemDataActualizada[EnvironmentApiRest.id] ?? '';

    //   final Map<String, dynamic>? original = (dataOriginal.isEmpty)
    // ? <String, dynamic>{}
    // : dataOriginal.firstWhere(
    //     <String, Object>(itemDataOriginal) =>
    //         itemDataOriginal[EnvironmentApiRest.id] == idValue,
    //     orElse: () => <String, dynamic>{},
    //   );

    final List<Map<String, dynamic>> dataOriginalMap =
        _convertirListaDynamic(dataOriginal);

    /// Busca el item correspondiente en dataOriginal por ID;
    /// si no lo encuentra, retorna un mapa vacío (evitamos excepción).
    /// Aca no se aplica el OrElse porque puede dar un error al querer tratar
    /// un Mapa de tipo <String, Object> como un Map<String, dynamic>.
    /// entonces original puede ser null en ese caso cuando se lo trata como
    /// parametro en `newMap` se aplica decodeJsonOrJsonOriginal y de esta
    /// manera se obtiene el mapa vacio. Map<String, dynamic>.
    final original = (dataOriginalMap.isEmpty)
        ? <String, dynamic>{}
        : dataOriginalMap.firstWhere(
            (itemDataOriginal) =>
                itemDataOriginal[EnvironmentApiRest.id] == idValue,
            orElse: () => <String, dynamic>{},
          );

    if (kDebugMode) {
      FlutterUtilsProvider.logDebug(
        'Buscando diferencias en el ítem de arrayObject: '
        'Original: $original - Actualizado: $itemDataActualizada',
      );
    }

    /// Ajuste de exclusiones dinámicas:
    /// si el id comienza con `temp_`, se excluye la clave `id`.
    List<String>? lstKeyExcluirFinal;
    if (idValue.startsWith(EnvironmentApiRest.prefijoTemp)) {
      lstKeyExcluirFinal = [EnvironmentApiRest.id];
    }
    if (lstKeyExcluir != null) {
      lstKeyExcluirFinal ??= [];
      lstKeyExcluirFinal.addAll(lstKeyExcluir);
    }

    final Map<String, dynamic> diferencia = newMap(
      esquema: esquema,
      mapaOriginal: decodeJsonOrJsonOriginal(original),
      mapaActualizado: decodeJsonOrJsonOriginal(itemDataActualizada),
      lstKeyExcluir: lstKeyExcluirFinal,
      lstKeyMantener: lstKeyMantener,
      lstPrefijosExcluir: lstPrefijosExcluir,
    );

    FlutterUtilsProvider.logDebug(
      'Resultado de diferencias en ítem de arrayObject: $diferencia',
    );

    if (diferencia.isNotEmpty) {
      // Si no comienza con `temp_`, mantenemos el `id`.
      if (!idValue.startsWith(EnvironmentApiRest.prefijoTemp)) {
        diferencia[EnvironmentApiRest.id] = idValue;
      }
      diferencias.add(Map<String, dynamic>.from(diferencia));
    }
  }

  return diferencias;
}