// Edge Function: crear-repartidor
// El dueño crea un repartidor de SU restaurante: crea el usuario auth (admin),
// lo marca como repartidor y lo suma a la flota. Valida al llamador internamente
// (sin imports por CDN, que fallan por IPv6 en Docker local).

const CORS = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
  'Access-Control-Allow-Methods': 'POST, OPTIONS',
};

function json(obj: unknown, status = 200) {
  return new Response(JSON.stringify(obj), {
    status,
    headers: { ...CORS, 'Content-Type': 'application/json' },
  });
}

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);

  try {
    const SUPABASE_URL = Deno.env.get('SUPABASE_URL')!;
    const ANON = Deno.env.get('SUPABASE_ANON_KEY')!;
    const SERVICE = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
    const svc = { apikey: SERVICE, Authorization: `Bearer ${SERVICE}` };

    const authHeader = req.headers.get('Authorization');
    if (!authHeader) return json({ error: 'No autorizado' }, 401);

    // 1) Validar la sesion del llamador.
    const uRes = await fetch(`${SUPABASE_URL}/auth/v1/user`, {
      headers: { Authorization: authHeader, apikey: ANON },
    });
    if (!uRes.ok) return json({ error: 'Sesion invalida' }, 401);
    const user = (await uRes.json()) as { id?: string };
    if (!user?.id) return json({ error: 'Sesion invalida' }, 401);

    // 2) El llamador debe ser dueño con restaurante.
    const pRes = await fetch(
      `${SUPABASE_URL}/rest/v1/perfiles?id=eq.${user.id}&select=rol,restaurante_id`,
      { headers: svc },
    );
    const perfiles = pRes.ok ? ((await pRes.json()) as { rol?: string; restaurante_id?: string }[]) : [];
    const dueno = perfiles?.[0];
    if (!dueno || dueno.rol !== 'dueno' || !dueno.restaurante_id) {
      return json({ error: 'Solo el dueño del negocio puede registrar repartidores.' }, 403);
    }
    const restauranteId = dueno.restaurante_id;

    // 3) Datos del repartidor.
    const { nombre, email, password, telefono, vehiculo } = await req.json();
    const correo = String(email ?? '').trim().toLowerCase();
    if (!nombre || !correo || !password || String(password).length < 6) {
      return json({ error: 'Faltan datos: nombre, correo y clave de al menos 6 caracteres.' }, 400);
    }

    // 4) Invitar por correo: crea la cuenta y le envia el link de activacion.
    const cRes = await fetch(`${SUPABASE_URL}/auth/v1/invite`, {
      method: 'POST',
      headers: { ...svc, 'Content-Type': 'application/json' },
      body: JSON.stringify({ email: correo, data: { nombre } }),
    });
    if (!cRes.ok) {
      const e = (await cRes.json().catch(() => ({}))) as Record<string, unknown>;
      const m = String(e?.msg ?? e?.message ?? e?.error_description ?? 'No se pudo crear el usuario');
      return json({ error: /already|registered|exists/i.test(m) ? 'Ese correo ya esta registrado.' : m }, 400);
    }
    const nuevo = (await cRes.json()) as { id?: string; user?: { id?: string } };
    const nuevoId = nuevo.id ?? nuevo.user?.id;
    if (!nuevoId) return json({ error: 'No se obtuvo el id del nuevo usuario' }, 500);

    // 4b) Ponerle la clave que eligio el negocio y confirmar la cuenta, para que la
    //     clave sirva de una (ademas del link de activacion que ya se envio al correo).
    await fetch(`${SUPABASE_URL}/auth/v1/admin/users/${nuevoId}`, {
      method: 'PUT',
      headers: { ...svc, 'Content-Type': 'application/json' },
      body: JSON.stringify({ password, email_confirm: true }),
    });

    // 5) Perfil -> repartidor (upsert por si el trigger ya creo el perfil).
    const upRes = await fetch(`${SUPABASE_URL}/rest/v1/perfiles?on_conflict=id`, {
      method: 'POST',
      headers: { ...svc, 'Content-Type': 'application/json', Prefer: 'resolution=merge-duplicates,return=minimal' },
      body: JSON.stringify({ id: nuevoId, rol: 'repartidor', restaurante_id: restauranteId, nombre, telefono: telefono || null }),
    });
    if (!upRes.ok) {
      const t = await upRes.text();
      return json({ error: 'No se pudo configurar el perfil: ' + t.slice(0, 150) }, 400);
    }

    // 6) Sumar a la flota del restaurante.
    const rRes = await fetch(`${SUPABASE_URL}/rest/v1/repartidores`, {
      method: 'POST',
      headers: { ...svc, 'Content-Type': 'application/json', Prefer: 'return=minimal' },
      body: JSON.stringify({ perfil_id: nuevoId, restaurante_id: restauranteId, vehiculo: vehiculo || null, estado: 'disponible' }),
    });
    if (!rRes.ok) {
      const t = await rRes.text();
      return json({ error: 'No se pudo agregar a la flota: ' + t.slice(0, 150) }, 400);
    }

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