import { TIPO_DOC_VIAJE } from './viajes.constants';

/**
 * Cuándo un documento enganchado al viaje está dado de baja.
 *
 * Es la única fuente de esta regla: la usan la propuesta, el enganche, los
 * cálculos (carga, matriz, cobranza, costos) y la pestaña Documentos. Antes cada
 * servicio tenía su propia lista y no coincidían (la cobranza excluía facturas
 * rechazadas por SIFEN y la carga ni miraba el estado).
 */

// Cada tabla escribe "anulado" a su manera. Rechazado = rechazado por SIFEN: el
// documento no tiene validez fiscal, así que cuenta como baja.
export const ESTADOS_ANULADOS = [
  'Anulado', 'Anulada', 'ANULADO', 'ANULADA', 'anulado', 'anulada',
  'Rechazado', 'Rechazada', 'RECHAZADO', 'RECHAZADA', 'rechazado', 'rechazada',
];

/**
 * Estados de baja POR TIPO. Una orden de venta se cancela con `cancelado`, y un
 * presupuesto con REJECTED / EXPIRED / CANCELLED / SUPERSEDED.
 */
const ESTADOS_BAJA: Record<string, string[]> = {
  [TIPO_DOC_VIAJE.PEDIDO]: [...ESTADOS_ANULADOS, 'cancelado', 'CANCELADO', 'Cancelado'],
  [TIPO_DOC_VIAJE.PRESUPUESTO]: [...ESTADOS_ANULADOS, 'REJECTED', 'EXPIRED', 'CANCELLED', 'SUPERSEDED', 'DRAFT'],
};

/**
 * Las órdenes de venta tienen un segundo estado: cancelar una OV pone
 * `estado_orden = 'cancelada'` y deja `estado` en 'borrador'. Mirando solo
 * `estado`, una OV cancelada se podía enganchar y seguía sumando en la carga.
 */
export const ESTADOS_ORDEN_BAJA = ['cancelada'];

export const estadosBaja = (tipo: string) => ESTADOS_BAJA[tipo] ?? ESTADOS_ANULADOS;

export function estaDeBaja(tipo: string, doc: { estado?: unknown; estado_orden?: unknown } | null | undefined) {
  if (!doc) return false;
  if (doc.estado != null && estadosBaja(tipo).includes(String(doc.estado))) return true;
  if (tipo === TIPO_DOC_VIAJE.PEDIDO && doc.estado_orden != null && ESTADOS_ORDEN_BAJA.includes(String(doc.estado_orden))) {
    return true;
  }
  return false;
}

/**
 * Condición Prisma para excluir OV canceladas. `estado_orden` es nulo en los
 * pedidos comunes, y un `notIn` descartaría también esos (NULL NOT IN → NULL).
 */
export const pedidoNoCancelado = {
  OR: [{ estado_orden: null }, { estado_orden: { notIn: ESTADOS_ORDEN_BAJA as any } }],
};
