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

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

  const supabase = createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        getAll() {
          return request.cookies.getAll();
        },
        setAll(cookiesToSet) {
          cookiesToSet.forEach(({ name, value }) =>
            request.cookies.set(name, value)
          );
          supabaseResponse = NextResponse.next({
            request,
          });
          cookiesToSet.forEach(({ name, value, options }) =>
            supabaseResponse.cookies.set(name, value, options)
          );
        },
      },
    }
  );

  // Use getUser() — the only safe server-side auth check (validates JWT with Supabase).
  // Do NOT use getSession() here — it reads unverified cookie data.
  const {
    data: { user },
  } = await supabase.auth.getUser();

  const pathname = request.nextUrl.pathname;

  // Route classification
  const protectedPaths = ["/dashboard", "/contractor", "/worker", "/messages", "/profile"];
  const isProtected = protectedPaths.some((p) => pathname.startsWith(p));
  const isSignup = pathname.includes("/signup");
  const isVerifyPage = pathname === "/auth/verify-email";
  const isAuthPage = pathname.startsWith("/auth/login") || pathname.startsWith("/auth/signup");

  // ── Not logged in ──
  if (!user) {
    // Redirect unauthenticated users away from protected routes (but allow signup pages)
    if (isProtected && !isSignup) {
      const url = request.nextUrl.clone();
      url.pathname = "/auth/login";
      return NextResponse.redirect(url);
    }
    return supabaseResponse;
  }

  // ── Logged in ──
  const emailVerified = !!user.email_confirmed_at;

  if (!emailVerified) {
    // Unverified user trying to access protected routes → send to verify page
    // (but let them stay on signup flows to finish onboarding after verification)
    if (isProtected && !isSignup && !isVerifyPage) {
      const url = request.nextUrl.clone();
      url.pathname = "/auth/verify-email";
      return NextResponse.redirect(url);
    }
  } else {
    // Verified user on auth pages → send to dashboard
    if (isAuthPage || isVerifyPage) {
      const url = request.nextUrl.clone();
      url.pathname = "/(authenticated)/dashboard";
      return NextResponse.redirect(url);
    }
  }

  return supabaseResponse;
}
