// Convenciones de canales Realtime, compartidas por las 3 apps.
//
// GPS: el repartidor emite su posicion por BROADCAST (canal efimero, NO toca la BD).
// Solo el comensal que rastrea ESE pedido se suscribe. Asi el GPS de alta frecuencia
// no genera escrituras a Postgres y el sistema aguanta muchos repartidores a la vez.

export function canalUbicacionPedido(pedidoId: string): string {
  return `pedido:${pedidoId}:ubicacion`;
}

// Canal por restaurante para avisar pedidos nuevos / cambios al panel del dueno.
export function canalPedidosRestaurante(restauranteId: string): string {
  return `restaurante:${restauranteId}:pedidos`;
}

// ---------------------------------------------------------------------------
// PANEL EN VIVO (2026-07-21): un solo canal PRIVADO por restaurante, alimentado
// desde la BD por triggers (fn_bcast_panel) con realtime.send(). Reemplaza los
// 7 postgres_changes que abria cada dispositivo del panel: postgres_changes
// evalua RLS por cambio x por suscriptor y con muchos locales mete lag.
// El nombre DEBE calzar con el topic del trigger y con la policy de
// realtime.messages ('rest-bcast-' || restaurante_id).
// ---------------------------------------------------------------------------

export function canalPanelRestaurante(restauranteId: string): string {
  return `rest-bcast-${restauranteId}`;
}

export const EVENTO_CAMBIO_PANEL = 'cambio';

// Payload minimo que emite fn_bcast_panel: lo justo para que cada vista decida
// si refresca (y traiga la fila puntual si la necesita).
export interface CambioPanel {
  tabla: 'pedidos' | 'cuentas_mesa' | 'llamadas_mesa' | 'pagos_mesa';
  accion: 'INSERT' | 'UPDATE' | 'DELETE';
  id: string;
  nuevo?: { estado?: string; tipo_entrega?: string; mesa?: string; verificado?: boolean };
  viejo?: { estado?: string };
}

// Canal de presencia de repartidores disponibles de un restaurante.
export function canalRepartidoresRestaurante(restauranteId: string): string {
  return `restaurante:${restauranteId}:repartidores`;
}

export const EVENTO_UBICACION = 'ubicacion';

export interface PosicionRepartidor {
  lat: number;
  lng: number;
  rumbo?: number | null; // grados 0-360, opcional
  velocidad?: number | null; // m/s, opcional
  en?: number; // epoch ms del emisor
}
