// vite.config.js

import { defineConfig } from 'vite';
import { resolve } from 'path';
import JavaScriptObfuscator from 'rollup-plugin-javascript-obfuscator';
import tailwindcss from '@tailwindcss/vite'
import viteCompression from 'vite-plugin-compression';

export default defineConfig({

    root: './assets',
    base: '/assets/',
    server: {
        host: "0.0.0.0",
        allowedHosts: ["esyweb.local"],

        port: 5173,

        open: false,

        cors: {
            origin: ['https://esyweb.local']
        },
    },
    resolve: {
        alias: {
            '@': resolve(__dirname, 'assets'),
        },
        // Extensions de fichiers à résoudre automatiquement
        extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue', '.scss', '.css'],
    },
    build: {
        outDir: resolve(__dirname, 'public/build'),
        assetsDir: '',
        emptyOutDir: true,
        manifest: true,
        sourcemap: false,
        // Minification par défaut : esbuild est déjà très rapide et efficace
        minify: 'esbuild',
        cssMinify: 'esbuild',
        // NOUVEAU : Stratégie de découpage du code pour améliorer le cache client
        rollupOptions: {
            input: {
                app: resolve(__dirname, 'assets/app.js'),
                admin: resolve(__dirname, 'assets/admin.js'),
            }
        },
    },

    // --- Plugins Vite ---
    plugins: [
        tailwindcss(),
        // NOUVEAU: Ajoutez Preact/React/Vue si vous utilisez ces frameworks
        // preact(),

        // 1. Compression des Assets (Gzip et Brotli)
        // Crée des fichiers .gz et .br à côté des assets originaux.
        // Votre serveur web (Nginx/Apache) doit être configuré pour servir ces versions compressées.
        viteCompression({
            verbose: true,
            disable: false,
            threshold: 10240, // Compresse seulement les fichiers > 10KB
            algorithm: 'gzip',
            ext: '.gz',
        }),
        viteCompression({
            verbose: true,
            disable: false,
            threshold: 10240,
            algorithm: 'brotliCompress', // Brotli est plus efficace que Gzip
            ext: '.br',
            // Ne génère le brotli que si l'algorithme est disponible (par défaut)
            deleteOriginFile: false // Important : gardez les fichiers originaux
        }),

        JavaScriptObfuscator({
            // Options recommandées pour un bon équilibre entre sécurité et performance
            compact: true,
            sourceMap: false,
            controlFlowFlattening: true, // Très efficace mais coûteux en performance à l'exécution
            deadCodeInjection: false,
            debugProtection: false,
            identifierNamesGenerator: 'hexadecimal', // Rend le code illisible
            log: false,
            numbersToExpressions: true,
            simplify: true,
            splitStrings: true,
            stringArray: true,
            stringArrayThreshold: 0.75,
            transformObjectKeys: true,
            unicodeEscapeSequence: false,
        }),

    ],
    define: {},
});
