import {
  AccionCliente,
  MotivoNoResuelto,
  ResultadoSugerido,
  Situacion,
} from 'src/catalogo/diagnostico/diagnosticar-documento';
import { TipoDocumento } from 'src/catalogo/tipos-documento';

export const INTENCIONES = [
  'incidente_documento',
  'consulta_dato',
  'consulta_negocio',
  'consulta_operativa',
  'seguimiento',
  'saludo',
  'otro',
] as const;
export type Intencion = (typeof INTENCIONES)[number];

export const CATEGORIAS = [
  'documento_sifen',
  'evento_sifen',
  'envio_correo',
  'timbrado_certificado',
  'consulta_operativa',
  'datos_negocio',
  'error_sistema',
  'otro',
] as const;
export type Categoria = (typeof CATEGORIAS)[number];

export const MOTIVOS: readonly MotivoNoResuelto[] = [
  'trabado_sifen',
  'falla_sifen_persistente',
  'sync_empresa_hub',
  'no_encontrado',
  'sin_permiso',
  'consulta_sin_respuesta_en_guias',
  'posible_error_sistema',
  'cliente_disconforme',
  'fuera_de_alcance',
];

export interface Extraccion {
  intencion: Intencion;
  tipoDocumento: TipoDocumento | null;
  /** Número o CDC tal como lo escribió el cliente; '' si no hay. */
  referencia: string;
  categoria: Categoria;
}

/** Un documento que el agente puede nombrar por código (c1, c2…) sin ver su id. */
export interface DocumentoRef {
  codigo: string;
  tipo: TipoDocumento;
  id: string;
  nro: string;
}

/** Estado de la máquina, guardado en tickets.estado_bot entre turnos. */
export interface EstadoBot {
  documentoActivo?: DocumentoRef;
  candidatos?: DocumentoRef[];
  /** Cuántas veces se le pidió el número (anti-repregunta: una sola). */
  pedidosDeReferencia: number;
  huboConsultaReal: boolean;
  /** Último diagnóstico del documento activo: lo que decide el resultado del ticket. */
  ultimoVeredicto?: { situacion: Situacion; resultado: ResultadoSugerido; motivo?: MotivoNoResuelto };
  /** Si el agente mandó al cliente a hacer algo, qué debería cambiar (verificación). */
  accionPendiente?: { accion: AccionCliente; documento: DocumentoRef; situacionAntes: Situacion };
  /** Contador para los códigos de documentos (c1, c2…), estable en todo el hilo. */
  siguienteCodigo: number;
}

export const ESTADO_INICIAL: EstadoBot = { pedidosDeReferencia: 0, huboConsultaReal: false, siguienteCodigo: 1 };

export function leerEstadoBot(valor: unknown): EstadoBot {
  const v = (valor && typeof valor === 'object' ? valor : {}) as Partial<EstadoBot>;
  return {
    ...ESTADO_INICIAL,
    ...v,
    pedidosDeReferencia: Number(v.pedidosDeReferencia ?? 0),
    siguienteCodigo: Number(v.siguienteCodigo ?? 1),
    huboConsultaReal: Boolean(v.huboConsultaReal),
  };
}

/** Lo que el modelo declara al final del turno (marca [[cierre:…]], ver cierre.ts). */
export const CIERRES = ['resuelto', 'autoservicio', 'no_resuelto', 'incompleto', 'saludo'] as const;
export type CierreDeclarado = (typeof CIERRES)[number];

export interface Cierre {
  resultado: CierreDeclarado;
  categoria: Categoria;
  motivo: MotivoNoResuelto | null;
}

/** Eventos que el servicio manda al navegador por SSE. */
export type EventoTurno =
  | { tipo: 'ticket'; id: string; numero: number }
  | { tipo: 'progreso'; texto: string }
  | { tipo: 'texto'; delta: string }
  | {
      tipo: 'fin';
      ticket_id: string;
      numero: number;
      resultado: string | null;
      pedir_conformidad: boolean;
    }
  | { tipo: 'error'; mensaje: string };
