import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { getToken } from "next-auth/jwt";

function decodeJWT(token: string): { exp?: number } | null {
  try {
    const payloadBase64 = token.split('.')[1];
    const payloadJson = Buffer.from(payloadBase64, 'base64').toString('utf-8');
    return JSON.parse(payloadJson);
  } catch (err) {
    console.error("Error decoding JWT:", err);
    return null;
  }
}

function isTokenMissingOrExpired(token?: string | null): boolean {
  if (!token || token.trim() === "") return true;
  const payload = decodeJWT(token);
  if (!payload?.exp) return true;
  const now = Math.floor(Date.now() / 1000);
  return payload.exp < now;
}


export async function middleware(request: NextRequest) {
  const loginUrl = "/login";

  const session = await getToken({
    req: request,
    secret: process.env.NEXT_PUBLIC_JWT_SECRET,
  });

  const jwt = session && 'picture' in session ? session.picture : null;

  const expiredOrMissing = isTokenMissingOrExpired(jwt);

  if (expiredOrMissing) {
    return NextResponse.redirect(new URL(loginUrl, request.url));
  }
}

export const config = {
  matcher: [
    "/((?!login|sign-up|forgot-username|forgot-password|reset-password|verify-email|customers/sign-up|carriers/sign-up|_next|favicon.ico|images|api).*)",
  ],

};
