import type { NextConfig } from "next";

// Headers de sécurité appliqués à toutes les routes.
// Référence : https://owasp.org/www-project-secure-headers/
const securityHeaders = [
  // HSTS : forcer HTTPS pendant 2 ans, inclus sous-domaines.
  // N'a d'effet qu'en HTTPS ; sans danger en local HTTP (les navigateurs ignorent).
  {
    key: "Strict-Transport-Security",
    value: "max-age=63072000; includeSubDomains; preload",
  },
  // Bloque l'inclusion du site dans une iframe (clickjacking).
  { key: "X-Frame-Options", value: "DENY" },
  // Empêche le sniffing MIME.
  { key: "X-Content-Type-Options", value: "nosniff" },
  // Limite le Referer envoyé en cross-origin.
  { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
  // Désactive par défaut tous les capteurs sensibles.
  {
    key: "Permissions-Policy",
    value: [
      "camera=()",
      "microphone=()",
      "geolocation=()",
      "payment=()",
      "usb=()",
      "interest-cohort=()",
    ].join(", "),
  },
  // Cross-origin policies : limite l'exposition aux attaques type Spectre.
  { key: "Cross-Origin-Opener-Policy", value: "same-origin" },
  { key: "X-DNS-Prefetch-Control", value: "on" },
  // Content-Security-Policy en Report-Only : on n'enforce pas tout de suite
  // pour eviter de casser le site, mais on collecte les violations potentielles
  // dans les devtools. Quand stable, basculer la clef en "Content-Security-Policy"
  // pour enforcer. Origines explicitement autorisees :
  //   - script-src : self + GA tag manager + Cloudflare Turnstile (anti-bot)
  //   - style-src : self + 'unsafe-inline' (Tailwind v4 inject styles + Recharts inline) + Fontshare CDN
  //   - font-src : self + Fontshare CDN (Cabinet Grotesk)
  //   - img-src : self + data: (SVG inline grain) + https (next/image distant)
  //   - connect-src : self + GA + Cloudflare verify (Turnstile siteverify)
  //   - frame-src : Cloudflare Turnstile challenge iframe
  //   - form-action 'self' empeche les formulaires de poster ailleurs
  {
    key: "Content-Security-Policy-Report-Only",
    value: [
      "default-src 'self'",
      "script-src 'self' 'unsafe-inline' https://www.googletagmanager.com https://challenges.cloudflare.com",
      "style-src 'self' 'unsafe-inline' https://api.fontshare.com https://cdn.fontshare.com",
      "font-src 'self' data: https://cdn.fontshare.com",
      "img-src 'self' data: blob: https:",
      "connect-src 'self' https://www.google-analytics.com https://challenges.cloudflare.com",
      "frame-src https://challenges.cloudflare.com",
      "form-action 'self'",
      "base-uri 'self'",
      "object-src 'none'",
      "frame-ancestors 'none'",
      "upgrade-insecure-requests",
    ].join("; "),
  },
];

const nextConfig: NextConfig = {
  reactStrictMode: true,
  poweredByHeader: false, // Retire l'en-tête X-Powered-By: Next.js (fingerprinting).

  // Build standalone : produit un .next/standalone autonome (server.js + node_modules
  // minimal) pour une image Docker légère. Sans ça, l'image embarque tout node_modules.
  output: "standalone",

  // Force-include de tout drizzle-orm + better-auth + leurs deps transitives dans
  // le bundle standalone. Le tracing Next ne suit pas scripts/migrate.mjs et
  // scripts/seed-admin.mjs (executes hors serveur Next), et certaines deps de
  // better-auth (@noble/*, jose, etc.) ne sont pas tracees parce que le code
  // Next ne les touche jamais directement, seules les routines de hash le font.
  outputFileTracingIncludes: {
    "/": [
      "./node_modules/drizzle-orm/**",
      "./node_modules/better-auth/**",
      "./node_modules/@better-auth/**",
      "./node_modules/@better-fetch/**",
      "./node_modules/@noble/**",
      "./node_modules/better-call/**",
      "./node_modules/defu/**",
      "./node_modules/jose/**",
      "./node_modules/kysely/**",
      "./node_modules/nanostores/**",
      "./node_modules/zod/**",
      "./node_modules/postgres/**",
      "./node_modules/@googleapis/**",
      "./node_modules/google-auth-library/**",
      "./node_modules/googleapis-common/**",
      "./node_modules/gaxios/**",
      "./node_modules/gcp-metadata/**",
      "./node_modules/gtoken/**",
      // Envoi d'emails SMTP : tracing manuel parce que le bundle standalone
      // Next n'embarque pas nodemailer et ses helpers (mime, dns, etc) sinon.
      "./node_modules/nodemailer/**",
    ],
  },

  async headers() {
    return [
      {
        source: "/:path*",
        headers: securityHeaders,
      },
    ];
  },

  // Domaines autorisés pour next/image (à ajouter quand on consommera des images externes).
  images: {
    remotePatterns: [],
  },

  // Server Actions : autoriser l'upload de captures jusqu'à 10 MB
  // (les screenshots iPhone HD peuvent dépasser le défaut Next.js de 1 MB).
  experimental: {
    serverActions: {
      bodySizeLimit: "10mb",
    },
  },
};

export default nextConfig;
