import { NextResponse } from "next/server";
import { cookies } from "next/headers";
import { createRouteHandlerClient } from "@supabase/auth-helpers-nextjs";
import { createClient } from "@supabase/supabase-js";

// Types de rôles autorisés (alignés avec public.role)
const ROLES = ["SUPER_ADMIN","ADMIN","AGENT","COMPTA"] as const;
type Role = typeof ROLES[number];

export async function POST(req: Request) {
  try {
    // 1) Vérifier que l’appelant est Staff
    const sb = createRouteHandlerClient({ cookies });
    const { data: { user } } = await sb.auth.getUser();
    if (!user) return new NextResponse("Unauthorized", { status: 401 });

    const { data: staff } = await sb
      .from("staff_users")
      .select("is_staff")
      .eq("user_id", user.id)
      .maybeSingle();

    if (!staff?.is_staff) return new NextResponse("Forbidden", { status: 403 });

    // 2) Lire input
    const body = await req.json();
    const email = String(body.email || "").trim().toLowerCase();
    const firstName = String(body.firstName || "").trim();
    const orgId = String(body.orgId || "").trim();
    const role = String(body.role || "").trim().toUpperCase() as Role;

    if (!email || !orgId || !ROLES.includes(role)) {
      return NextResponse.json({ error: "invalid_input" }, { status: 400 });
    }

    // 3) Vérifier que l’org est accessible (RLS)
    const { data: org } = await sb
      .from("organizations")
      .select("id,name,structure_api")
      .eq("id", orgId)
      .maybeSingle();
    if (!org) return NextResponse.json({ error: "org_not_found" }, { status: 404 });

    // 4) Client admin Supabase (service role) — server only
    const admin = createClient(
      process.env.NEXT_PUBLIC_SUPABASE_URL!,
      process.env.SUPABASE_SERVICE_ROLE_KEY!, // ⚠️ server-side only
      { auth: { autoRefreshToken: false, persistSession: false } }
    );

    // 5) Créer l'utilisateur SANS envoyer d'email (désactivation temporaire des notifications Supabase)
    //    On utilise createUser plutôt que inviteUserByEmail pour éviter l'envoi d'un e-mail automatique.
    const { data: created, error: createErr } = await admin.auth.admin.createUser({
      email,
      // Confirmer immédiatement le compte et activer complètement l'utilisateur
      email_confirm: true,
      phone_confirm: true,
      user_metadata: { first_name: firstName || null },
      // Important : définir une date de confirmation pour que le compte soit complètement activé
      app_metadata: {},
    });
    if (createErr) return NextResponse.json({ error: createErr.message }, { status: 400 });

    const newUserId = created.user?.id;
    if (!newUserId) return NextResponse.json({ error: "create_failed" }, { status: 400 });

    // 6) Attacher à l’organisation avec le rôle
    const { error: memberErr } = await admin
      .from("organization_members")
      .insert({ org_id: orgId, user_id: newUserId, role });
    if (memberErr) {
      // rollback léger : on pourrait désactiver l’utilisateur si besoin
      return NextResponse.json({ error: memberErr.message }, { status: 400 });
    }

    // 7) (Optionnel) Préférences d’auth par défaut (magic link activé)
    await admin
      .from("user_auth_prefs")
      .upsert({ user_id: newUserId, allow_magic_link: true, allow_password: false });

    return NextResponse.json({
      ok: true,
      user_id: newUserId,
      email,
      org: { id: org.id, name: org.name },
      role,
    });
  } catch (e: any) {
    return new NextResponse(e?.message || "Internal Server Error", { status: 500 });
  }
}