import { NextResponse, NextRequest } from "next/server";

const protectedApi = [
  /^\/api\/posts\/[^/]+\/pin$/,
  /^\/api\/posts\/[^/]+\/approve$/,
];

export async function middleware(req: NextRequest) {
  const { pathname } = req.nextUrl;
  const response = NextResponse.next();
  const uid = req.cookies.get("uid")?.value;
  const isAdmin = req.cookies.get("isAdmin")?.value;

  // 세션 검증 엔드포인트 자체에 대해선 미들웨어 검증을 생략 (무한 루프 방지)
  if (pathname === "/api/auth/session") {
    return response;
  }

  // uid 쿠키가 있어도 실제 유저가 존재하지 않으면 비로그인으로 간주하고 쿠키 정리
  // 기본값은 쿠키 존재 여부 기준(네트워크 오류 시 과도한 로그아웃 방지)
  let authenticated = !!uid;
  if (uid) {
    try {
      const verifyUrl = new URL("/api/auth/session", req.url);
      const verifyRes = await fetch(verifyUrl.toString(), {
        headers: {
          // 현재 요청의 쿠키를 전달하여 세션을 검증
          cookie: req.headers.get("cookie") ?? "",
        },
      });
      if (verifyRes.ok) {
        const data = await verifyRes.json().catch(() => ({ ok: false }));
        authenticated = !!data?.ok;
      } else {
        // 검증 API가 200이 아니면 기존 판단 유지(일시적 오류 대비)
        authenticated = !!uid;
      }
    } catch {
      // 네트워크/런타임 오류 시 기존 판단 유지(쿠키 있으면 로그인 간주)
      authenticated = !!uid;
    }
    // 유효하지 않은 uid 쿠키는 즉시 제거
    if (!authenticated) {
      response.cookies.set("uid", "", { path: "/", maxAge: 0 });
      response.cookies.set("isAdmin", "", { path: "/", maxAge: 0 });
    }
  }

  // Admin 페이지 보호
  if (pathname.startsWith("/admin")) {
    console.log("Admin 페이지 접근");
    console.log("uid", uid);
    // 비로그인 사용자는 로그인 페이지로
    if (!authenticated) {
      const loginUrl = req.nextUrl.clone();
      loginUrl.pathname = "/login";
      const res = NextResponse.redirect(loginUrl);
      // 리다이렉트 응답에도 쿠키 정리 반영
      if (uid && !authenticated) {
        res.cookies.set("uid", "", { path: "/", maxAge: 0 });
        res.cookies.set("isAdmin", "", { path: "/", maxAge: 0 });
      }
      return res;
    }
    // 로그인했지만 관리자가 아니면 홈으로
    if (isAdmin !== "1") {
      const homeUrl = req.nextUrl.clone();
      homeUrl.pathname = "/";
      return NextResponse.redirect(homeUrl);
    }
  }

  // 로그인된 상태에서 로그인 페이지 접근 시 홈으로 리다이렉트
  if (pathname === "/login" || pathname.startsWith("/login/")) {
    if (authenticated) {
      const homeUrl = req.nextUrl.clone();
      homeUrl.pathname = "/";
      return NextResponse.redirect(homeUrl);
    }
  }

  const needAuth = protectedApi.some((re) => re.test(pathname));
  if (needAuth && !authenticated) {
    return new NextResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401 });
  }
  
  return response;
}

export const config = {
  matcher: ["/((?!_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)"],
};

