import { NextRequest, NextResponse } from "next/server";
import { loggingMiddleware } from "@/middleware/loggingMiddleware";
import { errorHandler } from "@/middleware/errorHandler";
import { auth } from "@/lib/auth/auth";
import { headers } from "next/headers";

export async function middleware(request: NextRequest) {
    const url = request.nextUrl.clone();

    if (url.pathname.startsWith("/dashboard")) {
        const session = await auth.api.getSession({
            headers: await headers(),
        });

        if (!session) {
            return NextResponse.redirect(new URL("/login", request.url));
        }

        return NextResponse.next();
    }

    // Exclude `/api/auth` and its subpaths
    if (url.pathname.startsWith("/api/auth")) {
        return NextResponse.next();
    }

    if (url.pathname.startsWith("/api")) {
        const routeExists = checkRouteExists(url.pathname);
        // If the route does not exist, return a 404 JSON response
        if (!routeExists) {
            return new NextResponse(JSON.stringify({ message: "This API route does not exist.", status: 404 }), {
                status: 404,
                headers: { "Content-Type": "application/json" },
            });
        }
    }
    try {
        loggingMiddleware(request);
    } catch (err) {
        errorHandler(err);
    }
}
// Function to check if the route exists (supports dynamic routes)
function checkRouteExists(pathname: string) {
    // Define static and dynamic routes with patterns
    const routePatterns = [
        //do not delete
        // /^\/api\/auth\/\d+$/,        // Dynamic route with a number as a parameter (e.g., /api/dynamic/123)
        // /^\/api\/auth\/\w+$/,        // Dynamic route with a number as a parameter (e.g., /api/dynamic/123)
        // /^\/api\/agent\/healthcheck\/\w+$/,           // Dynamic route with an alphanumeric parameter (e.g., /api/user/username)
        /^\/api\/agent\/[^/]+\/status\/?$/, // Dynamic route for /api/agent/[id]/status
        /^\/api\/agent\/[^/]+\/backup\/?$/,
        /^\/api\/agent\/[^/]+\/restore\/?$/,
        /^\/api\/files\/[^/]+\/?$/,
        /^\/api\/images\/[^/]+\/?$/,
        /^\/api\/events\/?$/,
        /^\/api\/init\/?$/,
    ];
    return routePatterns.some((pattern) => pattern.test(pathname));
}

export const config = {
    runtime: "nodejs",
    matcher: [
        // '/api/agent/:path*',
        "/api/:path*",
        "/dashboard/:path*",
        "/dashboard",
    ],
};
