// Tipos de dominio y maquina de estados del pedido.
// Fuente unica de verdad compartida por las 3 apps.

export const ROLES = ['dueno', 'staff', 'encargado', 'repartidor', 'comensal', 'admin'] as const;
export type Rol = (typeof ROLES)[number];

export const TIPOS_ENTREGA = ['delivery', 'pickup', 'mesa', 'reserva'] as const;
export type TipoEntrega = (typeof TIPOS_ENTREGA)[number];

export const METODOS_PAGO = ['pago_movil', 'efectivo', 'transferencia', 'zelle', 'punto_venta'] as const;
export type MetodoPago = (typeof METODOS_PAGO)[number];

export const ESTADOS_PAGO = ['pendiente', 'verificando', 'confirmado', 'rechazado'] as const;
export type EstadoPago = (typeof ESTADOS_PAGO)[number];

// --- Maquina de estados del pedido ---
export const ESTADOS_PEDIDO = [
  'recibido',
  'confirmado',
  'preparando',
  'listo',
  'en_camino',
  'entregado',
  'cancelado',
] as const;
export type EstadoPedido = (typeof ESTADOS_PEDIDO)[number];

export const ESTADOS_FINALES: readonly EstadoPedido[] = ['entregado', 'cancelado'];

// Transiciones validas segun el tipo de entrega.
// El pickup salta el paso "en_camino".
export function siguientesEstados(estado: EstadoPedido, tipo: TipoEntrega): EstadoPedido[] {
  switch (estado) {
    case 'recibido':
      return ['confirmado', 'cancelado'];
    case 'confirmado':
      return ['preparando', 'cancelado'];
    case 'preparando':
      return ['listo', 'cancelado'];
    case 'listo':
      return tipo === 'delivery' ? ['en_camino', 'cancelado'] : ['entregado', 'cancelado'];
    case 'en_camino':
      return ['entregado'];
    default:
      return [];
  }
}

export function esTransicionValida(
  desde: EstadoPedido,
  hacia: EstadoPedido,
  tipo: TipoEntrega,
): boolean {
  return siguientesEstados(desde, tipo).includes(hacia);
}

export function esEstadoFinal(estado: EstadoPedido): boolean {
  return ESTADOS_FINALES.includes(estado);
}

// Etiquetas y colores para UI (consistentes entre apps).
export const ESTADO_META: Record<EstadoPedido, { label: string; color: string }> = {
  recibido: { label: 'Recibido', color: '#F59E0B' },
  confirmado: { label: 'Confirmado', color: '#3B82F6' },
  preparando: { label: 'Preparando', color: '#8B5CF6' },
  listo: { label: 'Listo', color: '#0EA5E9' },
  en_camino: { label: 'En camino', color: '#F97316' },
  entregado: { label: 'Entregado', color: '#16A34A' },
  cancelado: { label: 'Cancelado', color: '#DC2626' },
};

export const ESTADO_PAGO_META: Record<EstadoPago, { label: string; color: string }> = {
  pendiente: { label: 'Pago pendiente', color: '#9CA3AF' },
  verificando: { label: 'Verificando pago', color: '#F59E0B' },
  confirmado: { label: 'Pago confirmado', color: '#16A34A' },
  rechazado: { label: 'Pago rechazado', color: '#DC2626' },
};
