import type { RegistrarAlertaInput } from 'src/alertas-empresa/alertas-empresa.types';
import type { CasoEventoPendiente } from './clasificar-evento-pendiente';
import type { TipoDocumento } from './middleware-sifen.service';

/**
 * Alerta de empresa para un evento SIFEN inconsistente. Ver docs/plan-alertas-empresa.md.
 */

export type CasoAlertable = Extract<CasoEventoPendiente, 'incoherente' | 'sin_respuesta' | 'no_registrado' | 'middleware_falla'>;

export const TIPO_ALERTA_EVENTO_SIFEN = 'sifen_evento';

export const claveAlertaEvento = (tipoDocumento: TipoDocumento, documentoId: string) =>
  `${TIPO_ALERTA_EVENTO_SIFEN}:${tipoDocumento}:${documentoId}`;

const LABEL_DOCUMENTO: Record<TipoDocumento, string> = {
  factura: 'la factura',
  nota_credito: 'la nota de crédito',
  nota_remision: 'la nota de remisión',
  nota_debito: 'la nota de débito',
};

const TAB_DOCUMENTO: Record<TipoDocumento, string> = {
  factura: 'facturas',
  nota_credito: 'notas-credito',
  nota_remision: 'remisiones',
  nota_debito: 'notas-debito',
};

const NOMBRE_EVENTO: Record<string, string> = { ECAN: 'cancelación', EINU: 'inutilización', EINO: 'nominación' };

const POR_CASO: Record<CasoAlertable, { criticidad: 'alta' | 'media'; titulo: string; accion: string }> = {
  incoherente: {
    criticidad: 'alta',
    titulo: 'Evento de {evento} inconsistente en {doc} {numero}',
    accion: 'Reconsultá el evento; si SIFEN no lo tiene, reenvialo (o liberalo si ya no corresponde).',
  },
  no_registrado: {
    criticidad: 'alta',
    titulo: 'SIFEN no registró el evento de {evento} de {doc} {numero}',
    accion: 'Reenviá el evento; si ya no corresponde, liberalo indicando el motivo.',
  },
  sin_respuesta: {
    criticidad: 'media',
    titulo: 'Evento de {evento} sin respuesta de SIFEN en {doc} {numero}',
    accion: 'Reconsultá más tarde. Si sigue sin respuesta, contactá a soporte.',
  },
  middleware_falla: {
    criticidad: 'media',
    titulo: 'No se pudo consultar el evento de {evento} de {doc} {numero}',
    accion: 'Se reintenta solo cada 5 minutos. Si persiste, contactá a soporte.',
  },
};

export function alertaDeEvento(params: {
  empresaId: string;
  tipoDocumento: TipoDocumento;
  doc: { id: string; dest: string | null; dpunexp: string | null; dnumdoc: string | null; evento_aplicado: string | null };
  caso: CasoAlertable;
  detalle: string;
  sucursalId: string | null;
}): RegistrarAlertaInput {
  const { empresaId, tipoDocumento, doc, caso, detalle, sucursalId } = params;
  const numero = `${doc.dest ?? '???'}-${doc.dpunexp ?? '???'}-${doc.dnumdoc ?? '???????'}`;
  const evento = NOMBRE_EVENTO[doc.evento_aplicado ?? ''] ?? 'SIFEN';
  const conf = POR_CASO[caso];

  return {
    empresaId,
    clave: claveAlertaEvento(tipoDocumento, doc.id),
    tipo: TIPO_ALERTA_EVENTO_SIFEN,
    criticidad: conf.criticidad,
    titulo: conf.titulo
      .replace('{evento}', evento)
      .replace('{doc}', LABEL_DOCUMENTO[tipoDocumento])
      .replace('{numero}', numero),
    descripcion: detalle,
    accionSugerida: conf.accion,
    modulo: 'FISCAL',
    privilegioRequerido: 'FIS_SIF_SIFEN_VER',
    ruta: `/ventas?tab=${TAB_DOCUMENTO[tipoDocumento]}&buscar=${encodeURIComponent(numero)}`,
    sucursalId,
    entidadTipo: tipoDocumento,
    entidadId: doc.id,
    datos: { caso, tipoDocumento, documentoId: doc.id, numero, evento: doc.evento_aplicado },
    origen: 'sistema',
  };
}
