import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  /**
   * `output: 'standalone'` produit `.next/standalone/` qui contient un
   * server.js minimal et toutes les deps copiées. C'est ce qu'on copie
   * dans l'image Docker prod (slim, ~150 MB au lieu de 1.5 GB avec
   * tout node_modules).
   */
  output: "standalone",

  /**
   * Better Auth + postgres-js + PGlite font des requires dynamiques que
   * Turbopack n'aime pas tracer. On les marque external au build serveur.
   */
  serverExternalPackages: [
    "@electric-sql/pglite",
    "better-auth",
    "drizzle-orm",
    "postgres",
    "nodemailer",
  ],

  /**
   * Server Actions : whitelist des origines autorisées. Sans ça en prod
   * derrière reverse proxy, Next.js refuse les actions avec
   * "Invalid Server Actions request".
   *
   * encryptionKey : rend les IDs des Server Actions stables entre builds
   * (sinon un user qui garde un onglet ouvert pendant un redéploiement
   * voit "Server Action XXX was not found"). Lue depuis NEXT_SERVER_ACTIONS_ENCRYPTION_KEY.
   */
  experimental: {
    serverActions: {
      allowedOrigins: [
        "socialex.pro",
        "www.socialex.pro",
        "localhost:3001",
        "localhost:3000",
      ],
      bodySizeLimit: "25mb",
    },
  },

  /**
   * Cache long terme pour les assets statiques.
   * Lighthouse râlait que /bureau.png etc. n'étaient cachés que 4h.
   * Les images dans /public sont immutables (changement = nouveau nom),
   * donc on peut leur donner 1 an + immutable.
   * /_next/image et /_next/static sont déjà cachés correctement par Next.
   */
  async headers() {
    return [
      {
        source: "/:path*.(png|jpg|jpeg|webp|avif|svg|gif|ico|woff2|woff)",
        headers: [
          {
            key: "Cache-Control",
            value: "public, max-age=31536000, immutable",
          },
        ],
      },
    ];
  },

  /**
   * Compression des images servies via next/image.
   * AVIF est servi en priorité aux navigateurs qui le supportent (Chrome 85+,
   * Firefox 113+), avec fallback WebP, puis PNG d'origine.
   */
  images: {
    formats: ["image/avif", "image/webp"],
    minimumCacheTTL: 31536000,
  },
};

export default nextConfig;
