import type { NextConfig } from "next";

const csp = [
  "default-src 'self'",
  "base-uri 'self'",
  "object-src 'none'",
  "frame-ancestors 'self'",
  "form-action 'self'",
  "img-src 'self' data: blob: https:",
  "font-src 'self' data: https://cdn.fontshare.com",
  "style-src 'self' 'unsafe-inline' https://api.fontshare.com",
  [
    "script-src",
    "'self'",
    "'unsafe-inline'",
    process.env.NODE_ENV !== "production" ? "'unsafe-eval'" : "",
    "https://www.googletagmanager.com",
    "https://www.google-analytics.com",
    "https://js.hsforms.net",
    "https://challenges.cloudflare.com",
    "https://covalba-chatbot.vercel.app",
  ]
    .filter(Boolean)
    .join(" "),
  [
    "connect-src",
    "'self'",
    "https://api.hsforms.com",
    "https://*.hubspot.com",
    "https://*.hubapi.com",
    "https://www.googletagmanager.com",
    "https://www.google-analytics.com",
    "https://*.google-analytics.com",
    "https://analytics.google.com",
    "https://stats.g.doubleclick.net",
    "https://ad.doubleclick.net",
    "https://www.google.com",
    "https://challenges.cloudflare.com",
    "https://covalba-chatbot.vercel.app",
    "https://covalba-admin.paf-studio.dev",
  ].join(" "),
  [
    "frame-src",
    "'self'",
    "https://www.googletagmanager.com",
    "https://challenges.cloudflare.com",
    "https://maps.google.com",
    "https://www.google.com",
    "https://www.youtube.com",
    "https://www.youtube-nocookie.com",
    "https://*.hubspot.com",
    "https://*.hsforms.com",
  ].join(" "),
  "upgrade-insecure-requests",
].join("; ");

const nextConfig: NextConfig = {
  poweredByHeader: false,
  experimental: {
    // Les pages lieux interrogent WordPress/GraphQL pendant le build.
    // On limite la parallélisation pour éviter de saturer MariaDB sur la préprod.
    staticGenerationMaxConcurrency: 2,
    staticGenerationMinPagesPerWorker: 100,
  },
  images: {
    formats: ["image/avif", "image/webp"],
    // Le design plafonne à 1200px (container) et ~1920px (héros full-bleed).
    // On retire les paliers 2048/3840 inutiles et on ajoute un palier 1200 exact.
    deviceSizes: [640, 750, 828, 1080, 1200, 1920],
    imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
    // Next 16 exige le whitelisting des qualities passées à <Image>.
    // Défaut projet 80 ; héros/LCP 90 ; thumbnails denses 70.
    qualities: [70, 80, 90],
    // Médias servis par le WordPress headless (covalba-admin).
    // Si NEXT_PUBLIC_WP_MEDIA_URL pointe vers un CDN/proxy, on l'autorise aussi
    // (générique, jamais en dur — auto-réparé si l'origine média bouge).
    remotePatterns: [
      {
        protocol: "https",
        hostname: "covalba-admin.paf-studio.dev",
        pathname: "/wp-content/uploads/**",
      },
      ...(process.env.NEXT_PUBLIC_WP_MEDIA_URL
        ? [
            {
              protocol: "https" as const,
              hostname: new URL(process.env.NEXT_PUBLIC_WP_MEDIA_URL).hostname,
              pathname: "/wp-content/uploads/**",
            },
          ]
        : []),
    ],
  },
  // Preview Paf-Studio : le hostname vient de .env.local, jamais en dur.
  allowedDevOrigins: process.env.PAF_STUDIO_PREVIEW_HOST
    ? [process.env.PAF_STUDIO_PREVIEW_HOST]
    : [],
  async headers() {
    return [
      {
        source: "/:path*",
        headers: [
          { key: "Content-Security-Policy", value: csp },
          { key: "X-Content-Type-Options", value: "nosniff" },
          { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
          { key: "X-Frame-Options", value: "SAMEORIGIN" },
          {
            key: "Permissions-Policy",
            value: "camera=(), microphone=(), geolocation=(), payment=(), usb=()",
          },
        ],
      },
    ];
  },
  async redirects() {
    return [
      { source: "/secteurs/tertiaire", destination: "/tertiaire", permanent: true },
      { source: "/secteurs/collectivite", destination: "/collectivit%C3%A9", permanent: true },
      { source: "/applicateurs", destination: "/devenir-applicateur", permanent: true },
      { source: "/covalba", destination: "/qui-sommes-nous", permanent: true },
      { source: "/prime-cee-cool-roof", destination: "/bat-en-112", permanent: true },
      { source: "/prime-cee", destination: "/bat-en-112", permanent: true },
      { source: "/livre-blanc", destination: "/guide-cool-roof", permanent: true },
      { source: "/simulateur-roi", destination: "/simulateur-economie-energie", permanent: true },
      { source: "/realisations", destination: "/references", permanent: true },
      // Blog — doublons/cannibalisation fusionnés (cf. spreadsheet « articles à supprimer / 301 »).
      { source: "/blog/cee-aide", destination: "/blog/certificat-economie-energie", permanent: true },
      { source: "/blog/montant-cee", destination: "/blog/certificat-economie-energie", permanent: true },
      { source: "/blog/renovation-toiture-bac-acier", destination: "/blog/comment-renover-toiture-metallique-en-bac-acier", permanent: true },
      { source: "/blog/preindre-les-toits-en-blanc-pour-avoir-moins-chaud", destination: "/blog/quels-sont-les-avantages-dune-toiture-blanche", permanent: true },
      { source: "/blog/peinture-blanche-contre-chaleur", destination: "/blog/quels-sont-les-avantages-dune-toiture-blanche", permanent: true },
      // Articles « villes » supprimés (terme géo réservé aux futures pages locales) → blog.
      { source: "/blog/cool-roof-grenoble", destination: "/guides", permanent: true },
      { source: "/blog/cool-roof-la-reunion", destination: "/guides", permanent: true },
      { source: "/blog/des-toits-blancs-pour-rafraichir-orleans", destination: "/guides", permanent: true },
    ];
  },
};

export default nextConfig;
