-- EL VOLCADO DEL ESQUEMA FISCAL PARA EL RESPALDO PROPIO (PLAN_INFRAESTRUCTURA,
-- trabajo 2: respaldo fuera del proveedor).
--
-- El proyecto esta en plan free: PITR apagado y lista de respaldos del
-- proveedor VACIA (verificado vivo 2026-07-31). Ahi viven los libros fiscales
-- de terceros: si alguien borra algo, no hay vuelta atras. Este volcado lo
-- llama un Worker programado, lo CIFRA fuera de aqui y lo guarda en un deposito
-- privado de otro proveedor. La funcion solo responde al service_role: no es
-- una puerta publica, es la pala del camion de mudanza.

create or replace function public.fn_respaldo_imprenta()
returns jsonb
language plpgsql
security definer
set search_path to 'public', 'fiscal'
as $$
declare
  v_rol text := coalesce(current_setting('request.jwt.claims', true)::jsonb ->> 'role', '');
begin
  -- Por PostgREST solo pasa el service_role. Una llamada directa de un rol de
  -- base con permisos (postgres en una migracion, por ejemplo) tambien sirve.
  if current_user not in ('postgres', 'supabase_admin') and v_rol <> 'service_role' then
    raise exception 'Sin permiso';
  end if;

  return jsonb_build_object(
    'version', 1,
    'generado_en', now(),
    'emisores', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.emisores t),
    'llaves', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.llaves t),
    'negocios', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.negocios t),
    'estaciones', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.estaciones t),
    'series', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.series t),
    'documentos', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.documentos t),
    'respaldo', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.respaldo t),
    'cola_gustito', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.cola_gustito t),
    'anulaciones_gustito', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.anulaciones_gustito t),
    'correos_factura', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.correos_factura t),
    'consultas_qr', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.consultas_qr t),
    'consultas_serial', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.consultas_serial t),
    'eventos_panel', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.eventos_panel t),
    'operadores', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.operadores t),
    'intentos', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.intentos t),
    'imprenta', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.imprenta t),
    'rangos_imprenta', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.rangos_imprenta t),
    'rangos_emisor', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.rangos_emisor t),
    'envios_mensuales', (select coalesce(jsonb_agg(to_jsonb(t)), '[]'::jsonb) from fiscal.envios_mensuales t)
  );
end;
$$;

-- Ni anon ni authenticated la ven: la puerta queda solo para el service_role.
revoke execute on function public.fn_respaldo_imprenta() from anon, authenticated, public;
