import type { NextConfig } from "next";

/**
 * تنظیمات Next.js و هدرهای امنیتی.
 *
 * CSP: فقط منابع خود سایت مجازند (اسکریپت، فونت، تصویر، اتصال).
 * Next.js برای hydration اسکریپت درون‌خطی دارد، پس 'unsafe-inline' برای script لازم است؛
 * nonce هم ممکن است ولی همه صفحات را دینامیک می‌کند و کش صفحه اصلی و محصولات از بین می‌رود.
 * انتقال به درگاه پرداخت با window.location انجام می‌شود که CSP آن را محدود نمی‌کند.
 */
const isDev = process.env.NODE_ENV !== "production";

// اگر عکس‌ها در فضای ابری (S3) هستند، دامنه آن هم برای تصاویر مجاز می‌شود
const mediaOrigin = process.env.STORAGE_DRIVER === "s3" && process.env.S3_PUBLIC_URL ? " " + new URL(process.env.S3_PUBLIC_URL).origin : "";

const csp = [
  "default-src 'self'",
  `script-src 'self' 'unsafe-inline'${isDev ? " 'unsafe-eval'" : ""}`,
  "style-src 'self' 'unsafe-inline'",
  `img-src 'self' data: blob:${mediaOrigin}`,
  "font-src 'self'",
  `connect-src 'self'${isDev ? " ws: wss:" : ""}`,
  "object-src 'none'",
  "base-uri 'self'",
  "form-action 'self'",
  "frame-ancestors 'none'",
  ...(isDev ? [] : ["upgrade-insecure-requests"]),
].join("; ");

const securityHeaders = [
  { key: "Content-Security-Policy", value: csp },
  { 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=(), payment=()" },
  { key: "Cross-Origin-Opener-Policy", value: "same-origin" },
  // HSTS فقط روی production (روی localhost مرورگر را برای همیشه به https قفل می‌کند)
  ...(isDev ? [] : [{ key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains; preload" }]),
];

const nextConfig: NextConfig = {
  poweredByHeader: false,
  reactStrictMode: true,
  compress: true,
  // آپلود عکس محصول با Server Action (هر فایل حداکثر ۱۰ مگابایت)
  experimental: { serverActions: { bodySizeLimit: "11mb" } },
  // صفحه علاقه‌مندی‌ها حذف شده؛ لینک‌های قدیمی به حساب کاربری بروند
  async redirects() {
    return [{ source: "/account/wishlist", destination: "/account", permanent: true }];
  },
  async headers() {
    return [
      { source: "/:path*", headers: securityHeaders },
      // فایل‌های برند و فونت تغییر نمی‌کنند؛ کش طولانی
      { source: "/brand/:file*", headers: [{ key: "Cache-Control", value: "public, max-age=2592000, stale-while-revalidate=86400" }] },
    ];
  },
};

export default nextConfig;
