import path from "node:path";
import type { NextConfig } from "next";

// 다층 캐시·SEO 차단(§4)의 응답 헤더 계층. immutable 정적 자산(_next/static, _next/image)은
// Next.js가 자체적으로 Cache-Control을 강제하므로 대상에서 제외해 자산 캐싱을 보존한다.
const SECURITY_HEADERS = [
  {
    key: "X-Robots-Tag",
    value: "noindex, nofollow, noarchive, nosnippet, noimageindex",
  },
  { key: "Cache-Control", value: "no-store, no-cache, must-revalidate" },
  { key: "Pragma", value: "no-cache" },
  { key: "X-Content-Type-Options", value: "nosniff" },
  { key: "X-Frame-Options", value: "DENY" },
  { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
  {
    key: "Permissions-Policy",
    value: "camera=(), microphone=(), geolocation=()",
  },
];

const nextConfig: NextConfig = {
  experimental: {
    serverActions: {
      // 이미지·첨부파일은 Server Action **본문에 실려** 온다(브라우저가 백엔드를 직접 부르지
      // 않으므로 — 토큰이 httpOnly 세션 안에만 있다). 기본값 1MB로는 웬만한 이미지가 요청
      // 단계에서 413으로 잘리는데, 그러면 **액션 본문이 실행조차 되지 않아** `useActionState`가
      // idle 그대로다 — 화면에는 오류도 토스트도 없이 폼만 비워져 "아무 반응 없음"으로 보인다.
      // 백엔드는 `CommonsMultipartResolver`가 100MB까지 받지만, 이 본문은 Next 서버 메모리에
      // 통째로 올라가므로 관리 화면에 필요한 만큼만 연다.
      bodySizeLimit: '10mb',
    },
  },

  // SCSS 로드 경로 — 프로젝트 루트를 Sass의 loadPaths에 넣어 `@use "@fox/styles/abstracts"`
  // 같은 루트 기준 절대 경로가 해석되게 한다. 이게 없으면 컴포넌트마다 `../../../` 상대
  // 경로를 써야 해서 @fox 폴더를 다른 프로젝트로 통째로 복사할 수 없다(포터블 요건).
  // tsconfig의 `@fox/*` alias는 TS/번들러 전용이라 Sass 해석에는 관여하지 않으므로,
  // 같은 경로를 여기서 한 번 더 선언해야 TS와 SCSS의 import 표기가 일치한다.
  sassOptions: {
    loadPaths: [path.join(process.cwd())],
  },
  async headers() {
    return [
      {
        source: "/((?!_next/static|_next/image|fonts/).*)",
        headers: SECURITY_HEADERS,
      },
      {
        // `public/fonts`는 Next.js가 해시 경로를 붙여주지 않아 위 no-store 규칙에 그대로
        // 걸린다 — 제외하지 않으면 페이지를 열 때마다 Pretendard 2.2MB를 다시 받는다.
        // `immutable`은 일부러 뺐다: 파일명에 버전이 없어서 폰트를 같은 이름으로 교체했을 때
        // 새로고침조차 먹지 않게 된다.
        source: "/fonts/:path*",
        headers: [
          { key: "Cache-Control", value: "public, max-age=31536000" },
          { key: "X-Content-Type-Options", value: "nosniff" },
        ],
      },
    ];
  },
};

export default nextConfig;
