// Tipos del cerebrito (etapa 1: puente de impresion).

export interface ImpresoraCfg {
  /** Nombre del puesto tal como esta en puestos_impresion (sin importar acentos/mayusculas). */
  puesto: string;
  /** 'tcp' = termica de red (host:puerto 9100). 'usb' = cola de impresion de Windows (host = nombre de la cola, puerto se ignora). */
  tipo: 'tcp' | 'usb';
  host: string;
  puerto: number;
}

export interface Config {
  supabaseUrl: string;
  anonKey: string;
  /** Cuenta del negocio con la que entra el cerebrito: encargado o dueno (ven TODOS los pedidos). */
  correo: string;
  clave: string;
  impresoras: ImpresoraCfg[];
  /** Que hacer con renglones cuyo producto/categoria no tiene puesto: mandarlos al puesto por defecto o no imprimirlos. */
  sinPuesto?: 'defecto' | 'ignorar';
  /** Carpeta donde vive el estado local (ledger de impresos). Por defecto ./estado */
  carpetaEstado?: string;
  /**
   * Laptop SUPLENTE: instalada y configurada pero SIN imprimir (solo una laptop
   * puede tener el mando; dos imprimiendo = comandas dobles). El boton
   * "Asumir el mando" del asistente la activa.
   */
  enReserva?: boolean;
  /** PIN de sala del POS local (lo fijan en el asistente; las tablets entran con el). */
  pinSala?: string;
  /**
   * Ticket de despacho: papel adicional con datos del cliente, direccion y cobro
   * (para la bolsa y el repartidor). La cocina NUNCA recibe datos del cliente.
   * `puesto` dice en cual de las impresoras configuradas sale (ej: la de caja).
   * `tipos` limita a que entregas aplica (por defecto delivery y pickup).
   */
  despacho?: { puesto: string; tipos?: string[] };
  /**
   * La Estacion Fiscal del negocio (el instalable hermano, 127.0.0.1:8739).
   * Si esta puesta, cada venta que la caja cierra se le entrega DIRECTO, sin
   * pasar por la nube: el negocio factura aunque el internet este caido. La
   * llave es la "llave de maquina" que muestra la pantalla de la Estacion.
   */
  estacionFiscal?: { url: string; llave: string };
}

export interface Puesto {
  id: string;
  nombre: string;
  orden: number;
  es_defecto: boolean;
  activo: boolean;
}

export interface ItemPedido {
  id: string;
  nombre: string;
  cantidad: number;
  nota: string | null;
  /** Snapshot de categorias.a_cocina (trigger tg_pedido_item_a_cocina): false = no se cocina (bebidas). */
  a_cocina: boolean | null;
  producto?: {
    puesto_id: string | null;
    categoria?: { puesto_id: string | null } | null;
  } | null;
}

export interface PedidoNube {
  id: string;
  codigo: string;
  estado: string;
  tipo_entrega: string;
  mesa: string | null;
  cuenta_id?: string | null;
  para_llevar: boolean | null;
  mesero_nombre: string | null;
  nota: string | null;
  recibido_en: string;
  /** 'caja' = venta directa del panel (nace entregada y cobrada; comanda con membrete CAJA). */
  origen?: string | null;
  pedido_items: ItemPedido[];
  // Datos para el ticket de despacho (la comanda de cocina no los usa).
  cliente_nombre: string | null;
  cliente_telefono: string | null;
  direccion: string | null;
  metodo_pago: string | null;
  total_usd: number | null;
  costo_delivery_usd: number | null;
  tasa_bs: number | null;
  pagos?: { metodo: string | null; estado: string | null; referencia: string | null }[];
}

export interface LineaComanda {
  texto: string;
  grande?: boolean;
  negrita?: boolean;
  centrada?: boolean;
}

export interface ComandaPuesto {
  puesto: Puesto;
  lineas: LineaComanda[];
}

/** Payload del canal en vivo del panel (mismo contrato que packages/shared/realtime.ts). */
export interface CambioPanel {
  tabla: 'pedidos' | 'cuentas_mesa' | 'llamadas_mesa' | 'pagos_mesa';
  accion: 'INSERT' | 'UPDATE' | 'DELETE';
  id: string;
  nuevo?: { estado?: string };
  viejo?: { estado?: string };
}
