/**
 * Validación UX compartida — formularios módulos comerciales.
 * Patrón referencia: useContratoUniClienteUniPunto (Swal → programarEnfoqueCampoFormulario).
 */

import Swal from 'sweetalert2';
import {
  construirErroresCamposObligatorios,
  obtenerPrimerCampoConError,
  programarEnfoqueCampoFormulario,
} from '../../Contratos/utils/validacionFormulario';

export interface OpcionesModalValidacion {
  errores: Record<string, string>;
  camposOrdenados: readonly string[];
  mapaIdsDom: Record<string, string>;
  tituloModal?: string;
  iconoModal?: 'warning' | 'error';
}

export function normalizarErroresServidor(
  errores: Record<string, string | string[]>,
): Record<string, string> {
  const out: Record<string, string> = {};
  for (const [clave, valor] of Object.entries(errores)) {
    out[clave] = Array.isArray(valor) ? valor[0] : String(valor);
  }
  return out;
}

export function validarCamposObligatoriosMaestro(
  datos: Record<string, unknown>,
  camposOrdenados: readonly string[],
  etiquetas: Record<string, string>,
): Record<string, string> {
  return construirErroresCamposObligatorios(datos, [...camposOrdenados], etiquetas);
}

/** Modal con primer error → al cerrar, foco en el campo (controlId / id DOM). */
export async function mostrarModalValidacionYEnfocar({
  errores,
  camposOrdenados,
  mapaIdsDom,
  tituloModal = 'Validación',
  iconoModal = 'warning',
}: OpcionesModalValidacion): Promise<string | null> {
  const primerCampo = obtenerPrimerCampoConError(errores, [...camposOrdenados]);
  if (!primerCampo) {
    const claves = Object.keys(errores);
    if (!claves.length) {
      return null;
    }
    const fallback = claves[0];
    const mensaje = errores[fallback];
    await Swal.fire({
      title: tituloModal,
      text: mensaje,
      icon: iconoModal,
      confirmButtonText: 'Entendido',
      returnFocus: false,
    });
    const idDom = mapaIdsDom[fallback] ?? fallback;
    programarEnfoqueCampoFormulario(idDom);
    return fallback;
  }

  const mensaje = errores[primerCampo];
  const idDom = mapaIdsDom[primerCampo] ?? primerCampo;

  await Swal.fire({
    title: tituloModal,
    text: mensaje,
    icon: iconoModal,
    confirmButtonText: 'Entendido',
    returnFocus: false,
  });

  programarEnfoqueCampoFormulario(idDom);
  return primerCampo;
}

// --- Comercializadoras ---

export const COMERCIALIZADORA_CAMPOS_ORDEN = ['NumCifCom', 'RazSocCom'] as const;

export const COMERCIALIZADORA_ETIQUETAS: Record<string, string> = {
  NumCifCom: 'NIF/CIF',
  RazSocCom: 'Razón Social',
};

export const COMERCIALIZADORA_IDS_DOM: Record<string, string> = {
  NumCifCom: 'NumCifCom',
  RazSocCom: 'RazSocCom',
};

// --- Productos ---

export const PRODUCTO_CAMPOS_ORDEN = ['DesPro', 'CodCom'] as const;

export const PRODUCTO_ETIQUETAS: Record<string, string> = {
  DesPro: 'Descripción del producto',
  CodCom: 'Comercializadora',
};

export const PRODUCTO_IDS_DOM: Record<string, string> = {
  DesPro: 'DesPro',
  CodCom: 'CodCom',
};

// --- Anexo productos ---

export const ANEXO_CAMPOS_ORDEN = ['DesAnePro', 'CodPro', 'FecIniAne', 'TipPre'] as const;

export const ANEXO_ETIQUETAS: Record<string, string> = {
  DesAnePro: 'Descripción del anexo',
  CodPro: 'Producto',
  FecIniAne: 'Fecha de inicio',
  TipPre: 'Tipo de precio',
};

export const ANEXO_IDS_DOM: Record<string, string> = {
  DesAnePro: 'DesAnePro',
  CodPro: 'CodPro',
  FecIniAne: 'FecIniAne',
  TipPre: 'TipPre',
};
