// Edge Function: limpiar-datos-viejos
// Red de seguridad de retencion (auditoria legal 2026-07-23): aunque un negocio
// nunca cierre su jornada, los datos personales no viven para siempre. El cron
// diario la llama y ella:
//   1) borra los ARCHIVOS de comprobantes con mas de 90 dias (pagos y pagos de
//      mesa) del bucket privado, ANTES de soltar sus punteros;
//   2) anonimiza pedidos viejos y suelta referencias/punteros via RPC interna
//      (fn_limpiar_datos_viejos, solo service_role).
// Protegida por el mismo secreto de cron que actualizar-tasa.
import { createClient } from 'npm:@supabase/supabase-js@2';

const CORS = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Headers': 'authorization, x-cron-secret, content-type',
  'Access-Control-Allow-Methods': 'POST, OPTIONS',
};
const json = (obj: unknown, status = 200) =>
  new Response(JSON.stringify(obj), { status, headers: { ...CORS, 'Content-Type': 'application/json' } });

const DIAS = 90;

Deno.serve(async (req) => {
  if (req.method === 'OPTIONS') return new Response('ok', { headers: CORS });
  if (req.method !== 'POST') return json({ error: 'Metodo no permitido' }, 405);

  const secret = req.headers.get('x-cron-secret');
  if (!secret || secret !== Deno.env.get('CRON_SECRET')) return json({ error: 'No autorizado' }, 401);

  try {
    const admin = createClient(Deno.env.get('SUPABASE_URL')!, Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!, {
      auth: { persistSession: false },
    });

    // 1) Archivos de comprobantes viejos: primero el archivo, despues el puntero.
    const { data: rutas, error: eRutas } = await admin.rpc('fn_comprobantes_viejos', {
      p_dias: DIAS,
      p_max: 200,
    });
    if (eRutas) return json({ error: 'fn_comprobantes_viejos: ' + eRutas.message }, 500);
    const lista = ((rutas ?? []) as { ruta: string }[]).map((r) => r.ruta).filter(Boolean);
    let archivosBorrados = 0;
    for (let i = 0; i < lista.length; i += 50) {
      const lote = lista.slice(i, i + 50);
      const { error: eDel } = await admin.storage.from('comprobantes').remove(lote);
      if (!eDel) archivosBorrados += lote.length;
      // Si un lote falla, seguimos: la RPC igual soltara los punteros y el
      // archivo huerfano queda inaccesible (bucket privado); se loguea abajo.
    }

    // 2) Anonimizar lo viejo y soltar referencias/punteros.
    const { data: resumen, error: eLimpia } = await admin.rpc('fn_limpiar_datos_viejos', { p_dias: DIAS });
    if (eLimpia) return json({ error: 'fn_limpiar_datos_viejos: ' + eLimpia.message }, 500);

    return json({
      ok: true,
      dias: DIAS,
      archivos_encontrados: lista.length,
      archivos_borrados: archivosBorrados,
      ...(resumen as Record<string, unknown>),
    });
  } catch (e) {
    return json({ error: 'Error inesperado', detalle: String(e) }, 500);
  }
});
