import type { Actions } from "./$types";
import { fail, redirect } from "@sveltejs/kit";
import { createUserWithCompany, authenticateUser } from "$lib/server/auth";

const SESSION_COOKIE_NAME = "neoad_session";

export const actions: Actions = {
  default: async ({ request, cookies, getClientAddress }) => {
    const formData = await request.formData();
    
    // User data
    const first_name = formData.get("first_name")?.toString();
    const last_name = formData.get("last_name")?.toString();
    const email = formData.get("email")?.toString();
    const password = formData.get("password")?.toString();
    const password_confirm = formData.get("password_confirm")?.toString();
    const terms = formData.get("terms") === "on";
    
    // Company data
    const account_type = formData.get("account_type")?.toString() as "advertiser" | "agency" | "broadcaster" | "provider";
    const company_name = formData.get("company_name")?.toString();
    const legal_type = formData.get("legal_type")?.toString();
    const siret = formData.get("siret")?.toString() || undefined;
    const rna = formData.get("rna")?.toString() || undefined;
    const address = formData.get("address")?.toString() || undefined;
    const postal_code = formData.get("postal_code")?.toString() || undefined;
    const city = formData.get("city")?.toString() || undefined;
    const company_phone = formData.get("company_phone")?.toString() || undefined;
    const company_email = formData.get("company_email")?.toString() || undefined;
    const job_title = formData.get("job_title")?.toString() || undefined;
    
    // Return data helper
    const returnData = {
      first_name,
      last_name,
      email,
      company_name,
      account_type,
      legal_type,
    };
    
    // Validation
    if (!first_name || !last_name || !email || !password || !password_confirm) {
      return fail(400, {
        error: "Tous les champs obligatoires doivent être remplis",
        ...returnData,
      });
    }
    
    if (!company_name || !legal_type || !account_type) {
      return fail(400, {
        error: "Les informations de la société sont obligatoires",
        ...returnData,
      });
    }
    
    // Validate SIRET or RNA based on legal_type
    if (legal_type === "association") {
      if (!rna) {
        return fail(400, {
          error: "Le numéro RNA est obligatoire pour une association",
          ...returnData,
        });
      }
    } else {
      if (!siret) {
        return fail(400, {
          error: "Le numéro SIRET est obligatoire",
          ...returnData,
        });
      }
      if (siret.length !== 14 || !/^\d{14}$/.test(siret)) {
        return fail(400, {
          error: "Le numéro SIRET doit contenir exactement 14 chiffres",
          ...returnData,
        });
      }
    }
    
    if (password !== password_confirm) {
      return fail(400, {
        error: "Les mots de passe ne correspondent pas",
        ...returnData,
      });
    }
    
    if (password.length < 8) {
      return fail(400, {
        error: "Le mot de passe doit contenir au moins 8 caractères",
        ...returnData,
      });
    }
    
    if (!terms) {
      return fail(400, {
        error: "Vous devez accepter les conditions générales",
        ...returnData,
      });
    }
    
    try {
      // Créer la company et l'utilisateur
      const result = await createUserWithCompany({
        user: {
          email,
          password,
          first_name,
          last_name,
          job_title,
        },
        company: {
          name: company_name,
          legal_type,
          account_type,
          siret,
          rna,
          address,
          postal_code,
          city,
          phone: company_phone,
          email: company_email,
        },
      });
      
      if (!result.success) {
        return fail(400, {
          error: result.error || "Une erreur est survenue",
          ...returnData,
        });
      }
      
      // Connecter automatiquement l'utilisateur
      const authResult = await authenticateUser(email, password, {
        ip_address: getClientAddress(),
        user_agent: request.headers.get("user-agent") || undefined,
      });
      
      if (authResult) {
        cookies.set(SESSION_COOKIE_NAME, authResult.token, {
          path: "/",
          httpOnly: true,
          secure: process.env.NODE_ENV === "production",
          sameSite: "lax",
          maxAge: 60 * 60 * 24 * 30, // 30 jours
        });
      }
      
      // Rediriger vers le bon dashboard selon le type de compte
      // Tout le monde vers le dashboard unifié
      throw redirect(303, '/dashboard');
    } catch (error) {
      // Re-throw redirect (SvelteKit utilise des exceptions pour les redirects)
      if ((error as any)?.status === 303) throw error;
      console.error("Erreur d'inscription:", error);
      return fail(500, {
        error: "Une erreur est survenue. Veuillez réessayer.",
        ...returnData,
      });
    }
  },
};
