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

// init.jsp SessionManager.hasSession 대응 - 인증 미들웨어
export function middleware(request: NextRequest) {
  const { pathname } = request.nextUrl;

  // 인증 불필요 경로
  const publicPaths = [
    "/login",
    "/m/login",
    "/signup",
    "/api/auth/login",
    "/api/auth/signup",
    "/api/auth/mobile-login",
    "/api/deploy/webhook",
    "/_next",
    "/favicon.ico",
    "/icon.svg",
    "/momo-logo.svg",
    "/momo-icon.svg",
    "/icon-192.png",
    "/icon-512.png",
    "/icon-180.png",
    "/manifest.json",
    "/sw.js",
    "/.well-known",
  ];
  // 랜딩 페이지: 세션이 살아있으면 대시보드로 직행 (이미 로그인된 사용자가 /로 들어와도 마케팅 화면 안 보이게)
  if (pathname === "/") {
    if (request.cookies.get("plm-session")) {
      return NextResponse.redirect(new URL("/m/dashboard", request.url));
    }
    return NextResponse.next();
  }
  // 로그인/가입 페이지도 세션 있으면 대시보드로
  if (pathname === "/login" || pathname === "/m/login" || pathname === "/signup") {
    if (request.cookies.get("plm-session")) {
      return NextResponse.redirect(new URL("/m/dashboard", request.url));
    }
  }
  // 모바일(앱/모바일브라우저)에서 /login 접근 시 /m/login 으로 전환
  if (pathname === "/login") {
    const ua = request.headers.get("user-agent") || "";
    const isMobile = /Mobile|Android|iPhone|iPad|iPod/i.test(ua);
    if (isMobile) {
      return NextResponse.redirect(new URL("/m/login", request.url));
    }
  }
  if (publicPaths.some((p) => pathname.startsWith(p))) {
    return NextResponse.next();
  }

  // 정적 자산(이미지/폰트/문서 등)은 인증 면제
  if (/\.(svg|png|jpg|jpeg|gif|webp|ico|woff2?|ttf|otf|css|js|map|html|htm|pdf|txt)$/i.test(pathname)) {
    return NextResponse.next();
  }

  // 세션 쿠키 또는 Authorization: Bearer 토큰 확인
  const sessionCookie = request.cookies.get("plm-session");
  const bearer = request.headers.get("authorization")?.startsWith("Bearer ");
  if (!sessionCookie && !bearer && !pathname.startsWith("/api")) {
    return NextResponse.redirect(new URL("/login", request.url));
  }

  if (!sessionCookie && !bearer && pathname.startsWith("/api")) {
    return NextResponse.json({ success: false, message: "Unauthorized" }, { status: 401 });
  }

  return NextResponse.next();
}

export const config = {
  matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"],
};
