-- Puestos de impresion (comandas por estacion: arepera, parrilla, barra).
-- Base del cerebrito local (etapa 1: puente de impresion). Nada del flujo
-- actual cambia hasta que un local configure sus puestos y conecte impresoras.

create table if not exists public.puestos_impresion (
  id uuid primary key default gen_random_uuid(),
  restaurante_id uuid not null references public.restaurantes(id) on delete cascade,
  nombre text not null,
  orden integer not null default 1,
  es_defecto boolean not null default false,
  activo boolean not null default true,
  creado_en timestamptz not null default now(),
  unique (restaurante_id, nombre)
);

comment on table public.puestos_impresion is
  'Estaciones de preparacion del local (arepera, parrilla, barra). El cerebrito parte cada pedido por puesto y le imprime a cada cocina solo lo suyo.';

-- Un solo puesto por defecto por restaurante: recibe lo que no tenga puesto asignado.
create unique index if not exists uq_puestos_impresion_defecto
  on public.puestos_impresion (restaurante_id) where es_defecto;

create index if not exists idx_puestos_impresion_rest on public.puestos_impresion (restaurante_id);

alter table public.puestos_impresion enable row level security;

-- El personal del restaurante los lee (el cerebrito entra como encargado o dueno);
-- solo el dueno (o un admin) los administra.
create policy puestos_impresion_select on public.puestos_impresion
  for select to authenticated
  using (public.fn_es_staff_de(restaurante_id) or public.fn_es_admin());

create policy puestos_impresion_write on public.puestos_impresion
  for all to authenticated
  using (public.fn_es_dueno_de(restaurante_id) or public.fn_es_admin())
  with check (public.fn_es_dueno_de(restaurante_id) or public.fn_es_admin());

-- Ruteo: cada categoria apunta a un puesto; un producto suelto puede tener
-- excepcion propia (productos.puesto_id pisa al de su categoria).
alter table public.categorias add column if not exists puesto_id uuid references public.puestos_impresion(id) on delete set null;
alter table public.productos  add column if not exists puesto_id uuid references public.puestos_impresion(id) on delete set null;

create index if not exists idx_categorias_puesto on public.categorias (puesto_id);
create index if not exists idx_productos_puesto  on public.productos (puesto_id);
