// Edge Function: eliminar-cuenta
// El usuario autenticado (negocio o repartidor) elimina SU propia cuenta.
// Valida el JWT, desactiva el restaurante si es dueno, y borra el usuario de auth
// (lo que cascadea el perfil -> repartidor y limpia referencias en pedidos).
// Cumple el requisito de Google Play de permitir eliminar la cuenta y sus datos.
import { createClient } from 'npm:@supabase/supabase-js@2';

const CORS = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, 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 SUPABASE_URL = Deno.env.get('SUPABASE_URL')!;
const SERVICE = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;

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 auth = req.headers.get('Authorization') ?? '';
  const jwt = auth.replace(/^Bearer\s+/i, '');
  if (!jwt) return json({ error: 'No autorizado' }, 401);

  const admin = createClient(SUPABASE_URL, SERVICE, { auth: { persistSession: false } });

  // 1) Validar el token y obtener al usuario que pide borrarse.
  const { data: userData, error: userErr } = await admin.auth.getUser(jwt);
  if (userErr || !userData.user) return json({ error: 'Sesion invalida' }, 401);
  const uid = userData.user.id;

  try {
    // 2) Leer su perfil (rol, restaurante, si es fundador).
    const { data: perfil } = await admin
      .from('perfiles')
      .select('rol, restaurante_id, es_fundador')
      .eq('id', uid)
      .maybeSingle();

    // Las cuentas de administracion no se eliminan por esta via.
    if (perfil?.es_fundador) {
      return json({ error: 'Esta cuenta no puede eliminarse desde aqui.' }, 403);
    }

    // 3) SOLO si es el dueno se desactiva el restaurante (el negocio es suyo).
    //    Un mesero/encargado/repartidor que borra SU cuenta no puede tumbar
    //    la tienda del negocio (bug corregido: antes 'staff' tambien apagaba todo).
    const rol = perfil?.rol;
    if (rol === 'dueno' && perfil?.restaurante_id) {
      await admin
        .from('restaurantes')
        .update({ publicado: false, activo: false, en_directorio: false, abierto: false })
        .eq('id', perfil.restaurante_id);
    }

    // 4) Borrar sus suscripciones push (por si no cascadean).
    await admin.from('push_subs').delete().eq('perfil_id', uid);

    // 5) Borrar el usuario de auth: cascadea perfil -> repartidor y limpia pedidos.
    const { error: delErr } = await admin.auth.admin.deleteUser(uid);
    if (delErr) return json({ error: 'No se pudo eliminar la cuenta', detalle: delErr.message }, 500);

    return json({ ok: true });
  } catch (e) {
    return json({ error: 'Error inesperado', detalle: String(e) }, 500);
  }
});
