/**
 * Lo que el sistema RECOMIENDA para cada concepto. Nunca se aplica solo: se
 * muestra en Mapeo y queda en la constancia (`cuenta_recomendada_codigo`).
 * Una recomendación apunta a otro concepto (se muestra la cuenta que la empresa
 * tiene en él) o a un modo.
 */
export type Recomendacion = { concepto: string } | { modo: 'SUMAR_A_PRINCIPAL' };

/** Conceptos que admiten "sumar a la cuenta principal" en vez de una cuenta. */
export const CONCEPTOS_CON_MODO: ReadonlySet<string> = new Set(['IMPORTACION_GASTO', 'IVA_NO_DEDUCIBLE']);

export const CONCEPTOS_NUEVOS = [
  'IMPORTACION_COMPRA',
  'IMPORTACION_GASTO',
  'IMPORTACION_PAGO_PROVEEDOR',
  'IMPORTACION_TRIBUTOS',
  'IMPORTACION_ANTICIPO_IRE',
  'IVA_NO_DEDUCIBLE',
];

export const RECOMENDACIONES: Record<string, Recomendacion> = {
  IMPORTACION_COMPRA: { concepto: 'IMPORTACIONES_EN_CURSO' },
  IMPORTACION_GASTO: { concepto: 'IMPORTACIONES_EN_CURSO' },
  // Esquema clásico: el pago cancela la deuda con el proveedor del exterior (la compra ya
  // entró a importaciones en curso; recomendar la misma cuenta duplicaría el costo).
  IMPORTACION_PAGO_PROVEEDOR: { concepto: 'PROVEEDORES_EXTERIOR' },
  IMPORTACION_TRIBUTOS: { concepto: 'IMPORTACIONES_EN_CURSO' },
  IMPORTACION_ANTICIPO_IRE: { concepto: 'RETENCION_RENTA_FAVOR' },
  IVA_NO_DEDUCIBLE: { modo: 'SUMAR_A_PRINCIPAL' },
};

/** Texto corto de la recomendación con las cuentas que la empresa tiene hoy. */
export function describirRecomendacion(
  concepto: string,
  cuentaDe: (concepto: string) => { codigo: string; descripcion: string } | null,
): { texto: string; codigo: string | null } | null {
  const r = RECOMENDACIONES[concepto];
  if (!r) return null;
  if ('modo' in r) return { texto: 'Sumar a la cuenta principal (la del gasto)', codigo: null };
  const c = cuentaDe(r.concepto);
  return c
    ? { texto: `${c.codigo} ${c.descripcion} (la de ${r.concepto})`, codigo: c.codigo }
    : { texto: `La cuenta de ${r.concepto} (todavía no mapeada)`, codigo: null };
}
