-- ============================================================
-- Gustito Express — Tasa de cambio global (USD -> Bs), actualizable automaticamente.
-- Los restaurantes con tasa_automatica = true siguen esta tasa (denormalizado
-- en restaurantes.tasa_bs para que la tienda lea un solo campo).
-- ============================================================
create table public.tasa_cambio (
  id             int primary key default 1,
  tasa_bs        numeric(12,2) not null,
  fuente         text not null default 'BCV',
  actualizado_en timestamptz not null default now(),
  constraint tasa_cambio_una_fila check (id = 1)
);
insert into public.tasa_cambio (id, tasa_bs, fuente) values (1, 674.93, 'BCV')
  on conflict (id) do nothing;

alter table public.tasa_cambio enable row level security;
create policy tasa_lectura_publica on public.tasa_cambio
  for select to anon, authenticated using (true);
grant select on public.tasa_cambio to anon, authenticated;
grant all on public.tasa_cambio to service_role;

-- Aplica una nueva tasa: guarda la global y actualiza a los que usan tasa automatica.
create or replace function public.aplicar_tasa_automatica(p_tasa numeric, p_fuente text default 'BCV')
returns void language plpgsql security definer set search_path = public
as $$
begin
  if p_tasa is null or p_tasa <= 0 then
    raise exception 'Tasa invalida';
  end if;
  insert into public.tasa_cambio (id, tasa_bs, fuente, actualizado_en)
  values (1, p_tasa, coalesce(p_fuente, 'BCV'), now())
  on conflict (id) do update
    set tasa_bs = excluded.tasa_bs, fuente = excluded.fuente, actualizado_en = now();

  update public.restaurantes set tasa_bs = p_tasa where tasa_automatica = true;
end;
$$;
grant execute on function public.aplicar_tasa_automatica(numeric, text) to service_role;
