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

const SESSION_COOKIE_NAME = "neoad_session";
const BROWSER_ID_COOKIE_NAME = "neoad_browser_id";

export const load: PageServerLoad = async ({ url }) => {
  return {
    redirect: url.searchParams.get("redirect") || "/dashboard",
  };
};

export const actions: Actions = {
  default: async ({ request, cookies, getClientAddress, url }) => {
    const formData = await request.formData();
    const email = formData.get("email")?.toString();
    const password = formData.get("password")?.toString();
    const remember = formData.get("remember") === "on";
    const redirectTo = url.searchParams.get("redirect") || "/dashboard";
    
    if (!email || !password) {
      return fail(400, {
        error: "Email et mot de passe requis",
        email,
      });
    }
    
    try {
      const result = await authenticateUser(email, password, {
        ip_address: getClientAddress(),
        user_agent: request.headers.get("user-agent") || undefined,
      });
      
      if (!result) {
        return fail(401, {
          error: "Email ou mot de passe incorrect",
          email,
        });
      }
      
      // Définir le cookie de session
      cookies.set(SESSION_COOKIE_NAME, result.token, {
        path: "/",
        httpOnly: true,
        secure: process.env.NODE_ENV === "production",
        sameSite: "lax",
        maxAge: remember ? 60 * 60 * 24 * 30 : 60 * 60 * 24, // 30 jours ou 1 jour
      });
      
      // Créer un browser_id et une multi-session si pas déjà présent
      let browserId = cookies.get(BROWSER_ID_COOKIE_NAME);
      if (!browserId) {
        browserId = nanoid(32);
        cookies.set(BROWSER_ID_COOKIE_NAME, browserId, {
          path: "/",
          httpOnly: true,
          secure: process.env.NODE_ENV === "production",
          sameSite: "lax",
          maxAge: 60 * 60 * 24 * 365, // 1 an
        });
        
        // Créer la multi-session avec cette première session
        await createMultiSession(result.token, browserId);
      }
      
      // Rediriger vers le dashboard unifié (sauf admin qui garde son dashboard séparé)
      let targetUrl = redirectTo;
      if (result.user.role === "admin") {
        targetUrl = "/admin";
      } else if (redirectTo === "/dashboard") {
        // Tout le monde vers /dashboard, le menu s'adaptera au rôle
        targetUrl = "/dashboard";
      }
      throw redirect(303, targetUrl);
    } catch (error) {
      // Re-throw redirect (SvelteKit utilise des exceptions pour les redirects)
      if ((error as any)?.status === 303) throw error;
      console.error("Erreur de connexion:", error);
      return fail(500, {
        error: "Une erreur est survenue. Veuillez réessayer.",
        email,
      });
    }
  },
};
