import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import {
  BACKEND_TOKEN_COOKIE_NAME, SESSION_COOKIE_NAME, getAuthenticatedHome, parseSessionToken,
} from '@/lib/session';

function matchesPath(pathname: string, root: string) {
  return pathname === root || pathname.startsWith(`${root}/`);
}

export async function middleware(request: NextRequest) {
  const { pathname } = request.nextUrl;
  const guestPage = pathname === '/' || matchesPath(pathname, '/login') || matchesPath(pathname, '/register');
  const protectedPage = ['/dashboard', '/agent', '/developer', '/registered-voters', '/users', '/bvas-info', '/bvas-report-1', '/bvas-report-2', '/bvas-report-3', '/incidents'].some((root) => matchesPath(pathname, root));
  if (!guestPage && !protectedPage) return NextResponse.next();

  const user = await parseSessionToken(
    request.cookies.get(SESSION_COOKIE_NAME)?.value,
    request.cookies.get(BACKEND_TOKEN_COOKIE_NAME)?.value
  );
  if (guestPage) {
    if (user) return NextResponse.redirect(new URL(getAuthenticatedHome(user), request.url));
    if (matchesPath(pathname, '/login')) {
      return NextResponse.redirect(new URL('/?screen=get_started', request.url));
    }
    return NextResponse.next();
  }

  if (!user) {
    return NextResponse.redirect(new URL('/?screen=get_started', request.url));
  }
  const home = getAuthenticatedHome(user);
  if ((matchesPath(pathname, '/dashboard') && home === '/agent') ||
      (matchesPath(pathname, '/agent') && home === '/dashboard')) {
    return NextResponse.redirect(new URL(home, request.url));
  }

  const headers = new Headers(request.headers);
  headers.set('x-user-id', user.id);
  headers.set('x-user-role', user.role);
  headers.set('x-user-scope', user.assigned_scope_id);
  const response = NextResponse.next({ request: { headers } });
  response.headers.set('Cache-Control', 'private, no-store');
  return response;
}

export const config = {
  matcher: ['/', '/login/:path*', '/register/:path*', '/dashboard/:path*', '/agent/:path*', '/developer/:path*', '/registered-voters/:path*', '/users/:path*', '/bvas-info/:path*', '/bvas-report-1/:path*', '/bvas-report-2/:path*', '/bvas-report-3/:path*', '/incidents/:path*'],
};
