// Interfaces de las filas del dominio (estables, independientes del tipo autogenerado).
// Se usan para tipar resultados de consultas/RPC en las apps.
import type { EstadoPedido, TipoEntrega, MetodoPago, EstadoPago, Rol } from './domain';

export interface PagoMovilDatos {
  banco?: string;
  cedula?: string;
  telefono?: string;
}

export interface MetodoPagoConfig {
  activo: boolean;
  banco?: string;
  cedula?: string;
  telefono?: string;
  correo?: string;
  titular?: string;
  cuenta?: string;
}

export interface MetodosPago {
  pago_movil?: MetodoPagoConfig;
  zelle?: MetodoPagoConfig;
  transferencia?: MetodoPagoConfig;
  efectivo?: MetodoPagoConfig;
}

export interface HorarioDia {
  activo: boolean;
  abre?: string;
  cierra?: string;
}

export type DiaSemana = 'lun' | 'mar' | 'mie' | 'jue' | 'vie' | 'sab' | 'dom';
export type Horarios = Partial<Record<DiaSemana, HorarioDia>>;

export interface Restaurante {
  id: string;
  slug: string;
  nombre: string;
  descripcion: string | null;
  logo_url: string | null;
  portada_url: string | null;
  color_primario: string;
  telefono: string | null;
  direccion: string | null;
  latitud: number | null;
  longitud: number | null;
  rubro: string | null;
  rubros: string[];
  estado_ve: string | null;
  municipio: string | null;
  en_directorio: boolean;
  tasa_bs: number | null;
  tasa_automatica: boolean;
  pago_movil_datos: PagoMovilDatos | null;
  metodos_pago: MetodosPago;
  costo_delivery_usd: number;
  hace_delivery: boolean;
  hace_pickup: boolean;
  delivery_modo: 'fijo' | 'zona' | 'distancia';
  delivery_radio_km: number | null;
  horarios: Horarios | null;
  num_mesas: number;
  sala_promedio_min: number;
  abierto: boolean;
  // Hora del ultimo cierre de caja: la jornada (ventas/reporte) va desde aqui.
  ultimo_cierre_en: string | null;
  activo: boolean;
  publicado: boolean;
  onboarding_completo: boolean;
}

export interface Categoria {
  id: string;
  restaurante_id: string;
  nombre: string;
  orden: number;
  // Grupo en la tienda: 'comida' | 'bebida' | 'adicional'.
  grupo: string;
  // Si va a la cocina (default true). Las bebidas se marcan en false.
  a_cocina: boolean;
  // Horario de venta EN LINEA (el personal vende igual): dias 0=domingo..6, y
  // franja horaria de Venezuela. null = se vende siempre. Ver horarioCategoria.ts.
  dias_semana: number[] | null;
  hora_desde: string | null;
  hora_hasta: string | null;
}

// Opciones/contornos por plato. El negocio define grupos (ej. "Relleno",
// "Contornos", "Bebida"); cada opcion puede sumar un precio extra.
export interface OpcionElegible {
  nombre: string;
  precio_extra: number;
}
export interface OpcionGrupo {
  // single = elige 1 · multi = varios (checkbox) · cantidad = cantidad por opcion
  tipo: 'single' | 'multi' | 'cantidad';
  nombre: string;
  obligatorio: boolean;
  max?: number | null;
  opciones: OpcionElegible[];
}

export interface Producto {
  id: string;
  restaurante_id: string;
  categoria_id: string | null;
  nombre: string;
  descripcion: string | null;
  precio_usd: number;
  foto_url: string | null;
  /** Hoy se acabo. El cliente SI lo ve, atenuado: le sirve saber que existe. */
  disponible: boolean;
  /**
   * Salio de la carta: el cliente NO lo ve. Es distinto de `disponible`, y se
   * archiva en vez de borrar para no perder el enlace con lo ya vendido ni las
   * recetas de costos, que se borran en cascada.
   */
  archivado: boolean;
  orden: number;
  opciones: OpcionGrupo[];
}

export interface Repartidor {
  id: string;
  perfil_id: string;
  restaurante_id: string;
  vehiculo: string | null;
  estado: 'disponible' | 'ocupado' | 'offline';
  ultima_latitud: number | null;
  ultima_longitud: number | null;
  ultima_ubicacion_en: string | null;
}

export interface Perfil {
  id: string;
  rol: Rol;
  restaurante_id: string | null;
  nombre: string | null;
  telefono: string | null;
  es_fundador?: boolean;
}

export interface Pedido {
  id: string;
  restaurante_id: string;
  codigo: string;
  cliente_nombre: string;
  cliente_telefono: string;
  cliente_cedula: string | null;
  tipo_entrega: TipoEntrega;
  mesa: string | null;
  para_llevar: boolean;
  personas: number | null;
  direccion: string | null;
  direccion_latitud: number | null;
  direccion_longitud: number | null;
  estado: EstadoPedido;
  subtotal_usd: number;
  costo_delivery_usd: number;
  total_usd: number;
  tasa_bs: number | null;
  metodo_pago: MetodoPago;
  nota: string | null;
  tiempo_estimado_min: number | null;
  repartidor_id: string | null;
  mesero_id: string | null;
  mesero_nombre: string | null;
  recibido_en: string;
  confirmado_en: string | null;
  listo_en: string | null;
  en_camino_en: string | null;
  entregado_en: string | null;
  cancelado_en: string | null;
}

export interface PedidoItem {
  id: string;
  pedido_id: string;
  producto_id: string | null;
  nombre: string;
  precio_usd: number;
  cantidad: number;
  nota: string | null;
  a_cocina: boolean;
}

export interface Pago {
  id: string;
  pedido_id: string;
  metodo: MetodoPago;
  monto_usd: number;
  referencia: string | null;
  comprobante_url: string | null;
  estado: EstadoPago;
  confirmado_por: string | null;
  confirmado_en: string | null;
}

// Resultado de la RPC pedido_ticket (ticket digital del comensal).
export interface TicketPedido {
  codigo: string;
  estado: EstadoPedido;
  tipo_entrega: TipoEntrega;
  mesa: string | null;
  cliente_nombre: string;
  cliente_telefono: string;
  cliente_cedula: string | null;
  total_usd: number;
  tasa_bs: number | null;
  pago_estado: EstadoPago;
  metodo_pago: MetodoPago;
  restaurante_nombre: string;
  restaurante_color: string;
  items: { nombre: string; cantidad: number; precio_usd: number; nota?: string | null }[];
}

// Resultado de la RPC pedido_seguimiento (campos seguros para el comensal anon).
export interface SeguimientoPedido {
  codigo: string;
  estado: EstadoPedido;
  tipo_entrega: TipoEntrega;
  total_usd: number;
  tasa_bs: number | null;
  restaurante_nombre: string;
  restaurante_telefono: string | null;
  restaurante_color: string;
  direccion: string | null;
  direccion_latitud: number | null;
  direccion_longitud: number | null;
  repartidor_latitud: number | null;
  repartidor_longitud: number | null;
  repartidor_ubicacion_en: string | null;
  tiempo_estimado_min: number | null;
  recibido_en: string;
  confirmado_en: string | null;
  listo_en: string | null;
  en_camino_en: string | null;
  entregado_en: string | null;
  mesa: string | null;
  cuenta_id: string | null;
  personas: number | null;
}
