import { createServerClient, type CookieOptions } from "@supabase/ssr";
import { NextResponse, type NextRequest } from "next/server";
import type { Database } from "./types";

export async function updateSession(request: NextRequest) {
  let supabaseResponse = NextResponse.next({ request });

  const supabase = createServerClient<Database>(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        get(name: string) {
          return request.cookies.get(name)?.value;
        },
        set(name: string, value: string, options: CookieOptions) {
          request.cookies.set({ name, value, ...options });
          supabaseResponse = NextResponse.next({ request });
          supabaseResponse.cookies.set({ name, value, ...options });
        },
        remove(name: string, options: CookieOptions) {
          request.cookies.set({ name, value: "", ...options });
          supabaseResponse = NextResponse.next({ request });
          supabaseResponse.cookies.set({ name, value: "", ...options });
        },
      },
    }
  );

  const {
    data: { user },
  } = await supabase.auth.getUser();

  const url = request.nextUrl.clone();
  const path = url.pathname;

  const isAuthRoute =
    path.startsWith("/login") || path.startsWith("/signup") || path === "/auth/callback";
  const isPublicAsset =
    path.startsWith("/_next") ||
    path.startsWith("/api/sirene") ||
    path.startsWith("/icons") ||
    path === "/manifest.json" ||
    path === "/sw.js" ||
    path.startsWith("/favicon");

  if (isPublicAsset) return supabaseResponse;

  if (!user && !isAuthRoute) {
    url.pathname = "/login";
    return NextResponse.redirect(url);
  }

  if (user && (path === "/login" || path === "/signup" || path === "/")) {
    const { data: profile } = await supabase
      .from("profiles")
      .select("statut, role")
      .eq("id", user.id)
      .single();

    if (profile?.statut === "en_attente" || profile?.statut === "refuse") {
      url.pathname = "/pending";
      return NextResponse.redirect(url);
    }
    url.pathname = "/catalogue";
    return NextResponse.redirect(url);
  }

  if (user && !isAuthRoute && path !== "/pending") {
    const { data: profile } = await supabase
      .from("profiles")
      .select("statut, role")
      .eq("id", user.id)
      .single();

    if (profile?.statut !== "valide" && path !== "/compte") {
      url.pathname = "/pending";
      return NextResponse.redirect(url);
    }

    if (path.startsWith("/admin") && profile?.role !== "admin") {
      url.pathname = "/catalogue";
      return NextResponse.redirect(url);
    }
  }

  return supabaseResponse;
}
