import { MotivoNoResuelto } from 'src/catalogo/diagnostico/diagnosticar-documento';
import { Categoria, Cierre, EstadoBot } from './tipos';

export type ResultadoTicket = 'RESUELTO' | 'RESUELTO_AUTOSERVICIO' | 'NO_RESUELTO' | 'SIN_CONSULTA';

export interface ResultadoTurno {
  /** null: el ticket sigue abierto esperando un dato del cliente; se conserva el resultado anterior. */
  resultado: ResultadoTicket | null;
  categoria: Categoria | null;
  motivo: MotivoNoResuelto | null;
  esConsultaReal: boolean;
}

/**
 * Resultado del ticket después de un turno. Determinístico (plan §6.4):
 *  - si hubo diagnóstico de un documento en este turno, manda el diagnóstico;
 *  - si el modelo declara no_resuelto, gana (es la lectura más conservadora);
 *  - si no hubo diagnóstico, se usa la declaración del modelo;
 *  - un saludo no es una consulta.
 */
export function resolverResultadoTurno(entrada: {
  cierre: Cierre | null;
  /** Veredicto del documento consultado EN ESTE TURNO, si lo hubo. */
  veredicto: EstadoBot['ultimoVeredicto'] | null;
  huboConsultaRealAntes: boolean;
  rechazoDelModelo: boolean;
}): ResultadoTurno {
  const { cierre, veredicto, huboConsultaRealAntes } = entrada;

  if (entrada.rechazoDelModelo) {
    return {
      resultado: 'NO_RESUELTO',
      categoria: cierre?.categoria ?? null,
      motivo: 'posible_error_sistema',
      esConsultaReal: true,
    };
  }

  if (cierre?.resultado === 'no_resuelto') {
    return {
      resultado: 'NO_RESUELTO',
      categoria: cierre.categoria,
      motivo: cierre.motivo ?? veredicto?.motivo ?? 'posible_error_sistema',
      esConsultaReal: true,
    };
  }

  if (veredicto) {
    return {
      resultado: veredicto.resultado,
      categoria: cierre?.categoria ?? 'documento_sifen',
      motivo: veredicto.resultado === 'NO_RESUELTO' ? (veredicto.motivo ?? 'posible_error_sistema') : null,
      esConsultaReal: true,
    };
  }

  switch (cierre?.resultado) {
    case 'resuelto':
      return { resultado: 'RESUELTO', categoria: cierre.categoria, motivo: null, esConsultaReal: true };
    case 'autoservicio':
      return { resultado: 'RESUELTO_AUTOSERVICIO', categoria: cierre.categoria, motivo: null, esConsultaReal: true };
    case 'saludo':
      return huboConsultaRealAntes
        ? { resultado: null, categoria: null, motivo: null, esConsultaReal: true }
        : { resultado: 'SIN_CONSULTA', categoria: null, motivo: null, esConsultaReal: false };
    case 'incompleto':
    default:
      // Sin declaración o pidiendo un dato: el ticket sigue abierto.
      return {
        resultado: null,
        categoria: cierre?.categoria ?? null,
        motivo: null,
        esConsultaReal: huboConsultaRealAntes || cierre?.resultado === 'incompleto',
      };
  }
}
