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

const projectRoot = path.dirname(fileURLToPath(import.meta.url));

// CSP candidate — livré en Report-Only (ne bloque rien) pour validation navigateur
// avant bascule en enforcing. Sources réelles du site :
//  - OpenPanel auto-hébergé : script /op1.js (self) + ingestion analytics.elevaseo.app
//  - Cal.com embed : script + iframe app.cal.com / cal.com
//  - Google Analytics (gaté consentement) : googletagmanager + google-analytics
//  - Images distantes : aceternity / unsplash / pravatar (cf. images.remotePatterns)
// 'unsafe-inline'/'unsafe-eval' requis par l'hydratation Next App Router + libs (three/framer).
const CSP_DIRECTIVES = [
  "default-src 'self'",
  "base-uri 'self'",
  "object-src 'none'",
  "form-action 'self'",
  "frame-ancestors 'none'",
  "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://app.cal.com https://cal.com https://www.googletagmanager.com",
  "style-src 'self' 'unsafe-inline'",
  "img-src 'self' data: blob: https://assets.aceternity.com https://images.unsplash.com https://i.pravatar.cc https://www.google-analytics.com",
  "font-src 'self' data:",
  "connect-src 'self' https://analytics.elevaseo.app https://app.cal.com https://cal.com https://www.google-analytics.com https://www.googletagmanager.com",
  "frame-src https://app.cal.com https://cal.com",
  "worker-src 'self' blob:",
  "manifest-src 'self'",
  "media-src 'self'",
  "upgrade-insecure-requests",
];

// `frame-ancestors` et `upgrade-insecure-requests` sont ignorés PAR SPEC dans une
// policy Report-Only. Les y livrer ne protégeait rien et faisait remonter deux
// erreurs console sur chaque page de la prod. On les sort donc de la variante
// Report-Only — sans les perdre : ils restent dans CSP_DIRECTIVES pour la future
// bascule en enforcing, et sont déjà servis par le header CSP enforced ci-dessous,
// le seul endroit où ils s'appliquent réellement.
const REPORT_ONLY_IGNORED = ["frame-ancestors", "upgrade-insecure-requests"];
const CSP_REPORT_ONLY = CSP_DIRECTIVES.filter(
  (directive) => !REPORT_ONLY_IGNORED.some((name) => directive.startsWith(name)),
).join("; ");

// `upgrade-insecure-requests` est réservé à la production. En dev le serveur ne
// parle que http :// — la directive réécrivait les requêtes relatives des routes
// d'icônes (app/icon.tsx, app/icon3.tsx) en https://nextjs.localhost, d'où deux
// ERR_SSL_PROTOCOL_ERROR par page. En prod le site est intégralement en https,
// la directive y est donc sans effet de bord (et redondante avec HSTS preload,
// mais on la garde comme filet pour les sous-ressources tierces).
const IS_PROD = process.env.NODE_ENV === "production";
const CSP_ENFORCED = CSP_DIRECTIVES.filter(
  (directive) =>
    directive.startsWith("frame-ancestors") ||
    (IS_PROD && directive.startsWith("upgrade-insecure-requests")),
).join("; ");

const nextConfig: NextConfig = {
  // Disable X-Powered-By header for security
  poweredByHeader: false,

  // Force trailing slashes for consistent URLs (SEO: prevents duplicate content)
  trailingSlash: true,

  // Pin Turbopack's workspace root to this project.
  // Without this, Next.js walks upward and picks a stray pnpm-lock.yaml in $HOME,
  // which breaks module resolution (tailwindcss, etc.).
  // https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopack#root-directory
  turbopack: {
    root: projectRoot,
  },

  // Optimize package imports for better tree-shaking
  experimental: {
    optimizePackageImports: [
      // Animation libraries — `motion` uniquement. `framer-motion` reste installé,
      // mais en dépendance TRANSITIVE de `motion` (motion@12 le réexporte) : plus
      // aucun import direct dans le code, donc plus rien à optimiser sous ce nom.
      "motion",
      // Analytics

      // Utility libraries
      "clsx",
      "tailwind-merge",
      "date-fns",
      // Icônes (gros barrels → tree-shaking par import direct)
      "lucide-react",
      "@tabler/icons-react",
      // Charts
      "recharts",
    ],
    // Server Actions configuration
    serverActions: {
      // Limit request body size to prevent DoS attacks
      bodySizeLimit: "2mb",
      // Allowed origins for CSRF protection
      allowedOrigins: [
        "localhost:3000",
        "aciebenergie.fr",
        "www.aciebenergie.fr",
      ],
    },
  },

  images: {
    // AVIF first (best compression), then WebP fallback
    formats: ["image/avif", "image/webp"],
    // Allowed quality values for image optimization
    qualities: [75, 80, 85],
    remotePatterns: [
      { hostname: "assets.aceternity.com" },
      { hostname: "images.unsplash.com" },
      { hostname: "i.pravatar.cc" },
    ],
  },

  async rewrites() {
    return [
      // /.well-known/* servis par des route handlers (les dossiers .well-known
      // ne sont pas scannés par l'App Router) — RFC 9116 + RFC 9727.
      { source: "/.well-known/security.txt", destination: "/api/wellknown/security" },
      { source: "/.well-known/api-catalog", destination: "/api/wellknown/api-catalog" },
      { source: "/.well-known/agent-skills/index.json", destination: "/api/wellknown/agent-skills" },
      // Source Markdown par article : <canonical>.md → MDX brut (agent-readiness).
      { source: "/:category/:slug([^/.]+).md", destination: "/api/md/:category/:slug" },
    ];
  },

  async headers() {
    return [
      {
        source: "/(.*)",
        headers: [
          {
            key: "X-Content-Type-Options",
            value: "nosniff",
          },
          {
            key: "X-Frame-Options",
            value: "DENY",
          },
          {
            key: "Referrer-Policy",
            value: "strict-origin-when-cross-origin",
          },
          {
            key: "X-DNS-Prefetch-Control",
            value: "on",
          },
          {
            key: "Strict-Transport-Security",
            value: "max-age=63072000; includeSubDomains; preload",
          },
          {
            key: "X-XSS-Protection",
            value: "1; mode=block",
          },
          {
            key: "Permissions-Policy",
            value: "camera=(), microphone=(), geolocation=()",
          },
          {
            // Les deux seules directives qui doivent être servies en ENFORCED :
            // anti-clickjacking (complète X-Frame-Options: DENY) et upgrade des
            // sous-ressources http. Toutes deux sont inertes en Report-Only.
            key: "Content-Security-Policy",
            value: CSP_ENFORCED,
          },
          {
            // Policy complète en Report-Only : ne bloque rien, remonte les
            // violations en console navigateur. À valider en nav puis basculer
            // en `Content-Security-Policy` (enforcing) — voir docs/verif/dev-verif-4.md.
            key: "Content-Security-Policy-Report-Only",
            value: CSP_REPORT_ONLY,
          },
          {
            // Les paramètres de tracking ne changent pas la réponse → le cache
            // navigateur/prefetch réutilise l'entrée canonique (perf/no-vary-search).
            key: "No-Vary-Search",
            value:
              'params=("utm_source" "utm_medium" "utm_campaign" "utm_term" "utm_content" "gclid" "fbclid" "msclkid" "ref")',
          },
          // NB : le header `Link` de discovery est posé dans proxy.ts (middleware),
          // car celui-ci fait `.set("Link", canonical)` et écraserait un header de config ici.
        ],
      },
      {
        source: "/api/:path*",
        headers: [
          {
            key: "X-Robots-Tag",
            value: "noindex, nofollow",
          },
        ],
      },
      {
        source: "/_next/:path*",
        headers: [
          {
            key: "X-Robots-Tag",
            value: "noindex, nofollow",
          },
        ],
      },
    ];
  },

  async redirects() {
    return [
      // Ancien /guides/ → /actualites/
      { source: "/guides/crise-energetique-2026-plan-action-entreprise", destination: "/actualites/crise-energetique-2026-plan-action-entreprise/", permanent: true },

      // /blog/ → /actualites/ (7 articles)
      { source: "/blog/crise-energetique-2026-plan-action-entreprise", destination: "/actualites/crise-energetique-2026-plan-action-entreprise/", permanent: true },
      { source: "/blog/crise-iran-2026-proteger-contrat-electricite-professionnel", destination: "/actualites/crise-iran-2026-proteger-contrat-electricite-professionnel/", permanent: true },
      { source: "/blog/detroit-ormuz-bloque-consequences-approvisionnement-energetique-france", destination: "/actualites/detroit-ormuz-bloque-consequences-approvisionnement-energetique-france/", permanent: true },
      { source: "/blog/guerre-iran-2026-impact-prix-electricite-entreprise", destination: "/actualites/guerre-iran-2026-impact-prix-electricite-entreprise/", permanent: true },
      { source: "/blog/guerre-moyen-orient-impact-prix-electricite-entreprise", destination: "/actualites/guerre-moyen-orient-impact-prix-electricite-entreprise/", permanent: true },
      { source: "/blog/marche-energie-decembre-2025", destination: "/actualites/marche-energie-decembre-2025/", permanent: true },
      { source: "/blog/prix-kwh-professionnel-2026", destination: "/actualites/prix-kwh-professionnel-2026/", permanent: true },

      // /blog/ → /reglementation/ (5 articles)
      { source: "/blog/audit-energetique-entreprise-guide-obligatoire-2026", destination: "/reglementation/audit-energetique-entreprise-guide-obligatoire-2026/", permanent: true },
      { source: "/blog/decret-bacs-2026-guide-complet-obligations-entreprise", destination: "/reglementation/decret-bacs-2026-guide-complet-obligations-entreprise/", permanent: true },
      { source: "/blog/decret-tertiaire-2026-obligations-entreprise", destination: "/reglementation/decret-tertiaire-2026-obligations-entreprise/", permanent: true },
      { source: "/blog/fin-arenh-impact-contrats-electricite", destination: "/reglementation/fin-arenh-impact-contrats-electricite/", permanent: true },
      { source: "/blog/fin-tarif-bleu-edf-pro-que-faire", destination: "/reglementation/fin-tarif-bleu-edf-pro-que-faire/", permanent: true },

      // /guides/ → /reglementation/ (5 articles déplacés en /reglementation/, fix 404)
      { source: "/guides/audit-energetique-entreprise-guide-obligatoire-2026", destination: "/reglementation/audit-energetique-entreprise-guide-obligatoire-2026/", permanent: true },
      { source: "/guides/decret-bacs-2026-guide-complet-obligations-entreprise", destination: "/reglementation/decret-bacs-2026-guide-complet-obligations-entreprise/", permanent: true },
      { source: "/guides/decret-tertiaire-2026-obligations-entreprise", destination: "/reglementation/decret-tertiaire-2026-obligations-entreprise/", permanent: true },
      { source: "/guides/fin-tarif-bleu-edf-pro-que-faire", destination: "/reglementation/fin-tarif-bleu-edf-pro-que-faire/", permanent: true },
      { source: "/guides/vnu-2026-versement-nucleaire-universel-guide-entreprise", destination: "/reglementation/vnu-2026-versement-nucleaire-universel-guide-entreprise/", permanent: true },

      // /blog/ → /guides/ (53 articles explicites)
      { source: "/blog/achat-electricite-par-clics-tranches-strategie-entreprise-2026", destination: "/guides/achat-electricite-par-clics-tranches-strategie-entreprise-2026/", permanent: true },
      { source: "/blog/achat-groupe-electricite-entreprise-guide-2026", destination: "/guides/achat-groupe-electricite-entreprise-guide-2026/", permanent: true },
      { source: "/blog/autoconsommation-solaire-entreprise-2026", destination: "/guides/autoconsommation-solaire-entreprise-2026/", permanent: true },
      { source: "/blog/cee-entreprise-certificat-economie-energie-guide-2026", destination: "/guides/cee-entreprise-certificat-economie-energie-guide-2026/", permanent: true },
      { source: "/blog/chauffage-industriel-optimiser-couts-energie-2026", destination: "/guides/chauffage-industriel-optimiser-couts-energie-2026/", permanent: true },
      { source: "/blog/choisir-offre-electricite-tpe-pme-2025", destination: "/guides/choisir-offre-electricite-tpe-pme-2025/", permanent: true },
      { source: "/blog/comparateur-electricite-professionnel-entreprise-2026", destination: "/outils/comparateur-electricite-pro/", permanent: true },
      { source: "/blog/comparateur-energie-pro", destination: "/outils/comparateur-electricite-pro/", permanent: true },
      { source: "/blog/comparatif-electricite-pro", destination: "/outils/comparateur-electricite-pro/", permanent: true },
      // Cannibalisation comparateur électricité pro — absorption 2026-04-29
      { source: "/guides/comparatif-electricite-pro", destination: "/outils/comparateur-electricite-pro/", permanent: true },
      { source: "/guides/comparateur-electricite-professionnel-entreprise-2026", destination: "/outils/comparateur-electricite-pro/", permanent: true },
      { source: "/guides/comparateur-energie-pro", destination: "/outils/comparateur-electricite-pro/", permanent: true },
      { source: "/blog/conseil-energie-entreprise-guide-expert-2026", destination: "/guides/conseil-energie-entreprise-guide-expert-2026/", permanent: true },
      { source: "/blog/contrat-electricite-pro-guide-2026", destination: "/guides/contrat-electricite-pro-guide-2026/", permanent: true },
      { source: "/blog/contrat-electricite-professionnel-guide-negociation-2026", destination: "/guides/contrat-electricite-professionnel-guide-negociation-2026/", permanent: true },
      { source: "/blog/courtier-electricite-professionnel", destination: "/guides/courtier-electricite-professionnel/", permanent: true },
      { source: "/blog/courtier-en-energie-comment-ca-marche-concretement", destination: "/guides/courtier-en-energie-comment-ca-marche-concretement/", permanent: true },
      { source: "/blog/courtier-en-energie-guide-complet", destination: "/guides/courtier-en-energie-guide-complet/", permanent: true },
      { source: "/blog/courtier-en-energie-roi-economies-entreprise", destination: "/guides/courtier-en-energie-roi-economies-entreprise/", permanent: true },
      { source: "/blog/courtier-en-energie-vs-comparateur-en-ligne", destination: "/guides/courtier-en-energie-vs-comparateur-en-ligne/", permanent: true },
      { source: "/blog/courtier-energie-copropriete-guide-syndic-2026", destination: "/guides/courtier-energie-copropriete-guide-syndic-2026/", permanent: true },
      { source: "/blog/courtier-energie-tertiaire", destination: "/guides/courtier-energie-tertiaire/", permanent: true },
      { source: "/blog/courtier-gaz-professionnel", destination: "/guides/courtier-gaz-professionnel/", permanent: true },
      { source: "/blog/devis-electricite-entreprise-guide-complet", destination: "/guides/devis-electricite-entreprise-guide-complet/", permanent: true },
      { source: "/blog/devis-electricite-multi-sites-professionnel", destination: "/guides/devis-electricite-multi-sites-professionnel/", permanent: true },
      { source: "/blog/devis-electricite-pro-erreurs-courantes", destination: "/guides/devis-electricite-pro-erreurs-courantes/", permanent: true },
      { source: "/blog/devis-electricite-professionnel", destination: "/guides/devis-electricite-professionnel/", permanent: true },
      { source: "/blog/economies-energie-entreprise", destination: "/guides/economies-energie-entreprise/", permanent: true },
      { source: "/blog/economies-energie-hotel-guide-2026", destination: "/guides/economies-energie-hotel-guide-2026/", permanent: true },
      { source: "/blog/edf-pro-alternatives-pme-2026", destination: "/guides/edf-pro-alternatives-pme-2026/", permanent: true },
      { source: "/blog/edf-pro-contrat-flexible-vs-garanti", destination: "/guides/edf-pro-contrat-flexible-vs-garanti/", permanent: true },
      { source: "/blog/effacement-electrique-entreprise-guide-complet-2026", destination: "/guides/effacement-electrique-entreprise-guide-complet-2026/", permanent: true },
      { source: "/blog/electricite-boulangerie-prix-economies-2026", destination: "/guides/electricite-boulangerie-prix-economies-2026/", permanent: true },
      { source: "/blog/electricite-exploitation-agricole-tarifs-2026", destination: "/guides/electricite-exploitation-agricole-tarifs-2026/", permanent: true },
      { source: "/blog/electricite-verte-entreprise-offres-guide-2026", destination: "/guides/electricite-verte-entreprise-offres-guide-2026/", permanent: true },
      { source: "/blog/energie-electrique-entreprise-comprendre-facture", destination: "/guides/energie-electrique-entreprise-comprendre-facture/", permanent: true },
      { source: "/blog/energie-electrique-industrie-optimiser-consommation", destination: "/guides/energie-electrique-industrie-optimiser-consommation/", permanent: true },
      { source: "/blog/energie-electrique-transition-entreprise-2026", destination: "/guides/energie-electrique-transition-entreprise-2026/", permanent: true },
      { source: "/blog/facture-electricite-entreprise-comprendre-optimiser-2026", destination: "/guides/facture-electricite-entreprise-comprendre-optimiser-2026/", permanent: true },
      { source: "/blog/fournisseur-electricite-professionnel-comparatif-guide-2026", destination: "/guides/fournisseur-electricite-professionnel-comparatif-guide-2026/", permanent: true },
      { source: "/blog/fournisseur-gaz-professionnel-comparatif-2026", destination: "/guides/fournisseur-gaz-professionnel-comparatif-2026/", permanent: true },
      { source: "/blog/garantie-origine-electricite-verte", destination: "/guides/garantie-origine-electricite-verte/", permanent: true },
      { source: "/blog/management-energie-entreprise", destination: "/guides/management-energie-entreprise/", permanent: true },
      { source: "/blog/mecanisme-capacite-electricite-impact-facture-entreprise-2026", destination: "/guides/mecanisme-capacite-electricite-impact-facture-entreprise-2026/", permanent: true },
      { source: "/blog/offre-electricite-verte-professionnel-comparatif-2026", destination: "/guides/offre-electricite-verte-professionnel-comparatif-2026/", permanent: true },
      { source: "/blog/optimisation-fiscale-energie-cspe-ticgn-remboursement-2026", destination: "/guides/optimisation-fiscale-energie-cspe-ticgn-remboursement-2026/", permanent: true },
      { source: "/blog/ppa-entreprise-power-purchase-agreement-guide-2026", destination: "/guides/ppa-entreprise-power-purchase-agreement-guide-2026/", permanent: true },
      { source: "/blog/prix-fixe-ou-indexe-electricite-entreprise-2026", destination: "/guides/prix-fixe-ou-indexe-electricite-entreprise-2026/", permanent: true },
      { source: "/blog/puissance-souscrite-optimiser-facture-professionnelle-2026", destination: "/guides/puissance-souscrite-optimiser-facture-professionnelle-2026/", permanent: true },
      { source: "/blog/relamping-led-entreprise-guide-aides-cee-2026", destination: "/guides/relamping-led-entreprise-guide-aides-cee-2026/", permanent: true },
      { source: "/blog/resiliation-contrat-gaz-professionnel-demarches-2026", destination: "/guides/resiliation-contrat-gaz-professionnel-demarches-2026/", permanent: true },
      { source: "/blog/rse-energie-entreprise-strategie-2026", destination: "/guides/rse-energie-entreprise-strategie-2026/", permanent: true },
      { source: "/blog/strategie-energetique-entreprise", destination: "/guides/strategie-energetique-entreprise/", permanent: true },
      { source: "/blog/suivi-consommation-energie-courbe-charge-entreprise-2026", destination: "/guides/suivi-consommation-energie-courbe-charge-entreprise-2026/", permanent: true },
      { source: "/blog/tarif-electricite-entreprise-grille-prix-2026", destination: "/guides/tarif-electricite-entreprise-grille-prix-2026/", permanent: true },
      { source: "/blog/turpe-optimisation-entreprise-2026", destination: "/guides/turpe-optimisation-entreprise-2026/", permanent: true },
    ];
  },

  skipTrailingSlashRedirect: false,
};

export default nextConfig;
