import { MotivoNoResuelto } from 'src/catalogo/diagnostico/diagnosticar-documento';

/**
 * Qué termina en YouTrack y con qué prioridad (plan §6.8). Lo decide el CÓDIGO
 * con el resultado determinístico del turno, nunca el modelo: un mensaje del
 * cliente no puede inducir a crear incidencias.
 */
export type MotivoCargable = Extract<
  MotivoNoResuelto,
  | 'trabado_sifen'
  | 'falla_sifen_persistente'
  | 'sync_empresa_hub'
  | 'posible_error_sistema'
  | 'consulta_sin_respuesta_en_guias'
  | 'cliente_disconforme'
>;

const PRIORIDAD: Record<MotivoCargable, string> = {
  trabado_sifen: 'Critical',
  posible_error_sistema: 'Major',
  falla_sifen_persistente: 'Normal',
  sync_empresa_hub: 'Normal',
  consulta_sin_respuesta_en_guias: 'Minor',
  cliente_disconforme: 'Minor',
};

const TITULO: Record<MotivoCargable, string> = {
  trabado_sifen: 'Documentos trabados en SIFEN',
  posible_error_sistema: 'Posible error del sistema',
  falla_sifen_persistente: 'Falla persistente de SIFEN',
  sync_empresa_hub: 'Empresa sin sincronizar con e-FacturaHub',
  consulta_sin_respuesta_en_guias: 'Pregunta de uso sin respuesta en el manual',
  cliente_disconforme: 'Cliente disconforme con una respuesta del agente',
};

export function motivoCargable(motivo: string | null | undefined): motivo is MotivoCargable {
  return !!motivo && motivo in PRIORIDAD;
}

/** Una incidencia por PROBLEMA, no por ticket: misma firma = mismo issue. */
export function firmaIncidencia(motivo: MotivoCargable, categoria: string | null | undefined): string {
  return `${motivo}|${categoria ?? 'general'}`;
}

export function prioridadIncidencia(motivo: MotivoCargable): string {
  return PRIORIDAD[motivo];
}

export function tituloIncidencia(motivo: MotivoCargable, categoria: string | null | undefined): string {
  return `[soporte-ia] ${TITULO[motivo]}${categoria && categoria !== 'otro' ? ` · ${categoria}` : ''}`;
}

export interface Ocurrencia {
  sop: number;
  ruc: string | null;
  razon_social: string | null;
  fecha: string;
}

export function lineaOcurrencia(o: Ocurrencia): string {
  const empresa = [o.ruc, o.razon_social].filter(Boolean).join(' ') || 'empresa sin datos';
  return `SOP-${o.sop} · ${empresa} · ${o.fecha}`;
}

/** Datos mínimos (plan §6.8): nunca el texto del cliente ni datos de sus clientes. */
export function descripcionIncidencia(entrada: {
  motivo: MotivoCargable;
  categoria: string | null;
  firma: string;
  primera: Ocurrencia;
}): string {
  return [
    'Incidencia creada automáticamente por el agente de Soporte IA.',
    '',
    `* Motivo: ${entrada.motivo}`,
    `* Categoría: ${entrada.categoria ?? 'general'}`,
    `* Firma: ${entrada.firma}`,
    `* Primera ocurrencia: ${lineaOcurrencia(entrada.primera)}`,
    '',
    'El hilo completo y las trazas están en el reporte de Soporte IA del panel (solo superadmin de Novasis).',
  ].join('\n');
}
