import { existsSync, readdirSync } from 'node:fs';
import { join, resolve } from 'node:path';
import { fileURLToPath } from 'node:url';
import inertia from '@inertiajs/vite';
import { wayfinder } from '@laravel/vite-plugin-wayfinder';
import tailwindcss from '@tailwindcss/vite';
import vue from '@vitejs/plugin-vue';
import laravel from 'laravel-vite-plugin';
import { bunny } from 'laravel-vite-plugin/fonts';
import { defineConfig } from 'vite';

const root = fileURLToPath(new URL('.', import.meta.url));

function themeCssInputs(): string[] {
    const themesDir = join(root, 'themes');

    if (!existsSync(themesDir)) {
        return [];
    }

    return readdirSync(themesDir, { withFileTypes: true })
        .filter((entry) => entry.isDirectory())
        .map((entry) => `themes/${entry.name}/resources/css/theme.css`)
        .filter((relative) => existsSync(join(root, relative)));
}

export default defineConfig({
    plugins: [
        laravel({
            input: [
                'resources/css/app.css',
                'resources/css/module-runtime.css',
                'resources/js/app.ts',
                ...themeCssInputs(),
            ],
            refresh: true,
            fonts: [
                bunny('Instrument Sans', {
                    weights: [400, 500, 600],
                }),
                bunny('Archivo', {
                    weights: [400, 500, 600],
                }),
                bunny('Space Grotesk', {
                    weights: [500, 600, 700],
                }),
                bunny('JetBrains Mono', {
                    weights: [400, 500, 600],
                }),
            ],
        }),
        inertia(),
        tailwindcss(),
        vue({
            template: {
                transformAssetUrls: {
                    base: null,
                    includeAbsolute: false,
                },
            },
        }),
        wayfinder({
            formVariants: true,
        }),
    ],
    resolve: {
        alias: [
            // Kit admin : source unique dans le thème console.
            // `@/ui/admin/*` reste le chemin public des modules.
            {
                find: '@/ui/admin',
                replacement: resolve(
                    root,
                    'themes/admin-console/resources/js/ui',
                ),
            },
            {
                find: '@/lib/admin',
                replacement: resolve(
                    root,
                    'themes/admin-console/resources/js/lib',
                ),
            },
            {
                find: '@ledger',
                replacement: resolve(root, 'themes/ledger/resources/js'),
            },
            {
                find: '@admin-theme',
                replacement: resolve(root, 'themes/admin-console/resources/js'),
            },
            {
                find: '@deskmethod/ui',
                replacement: resolve(root, 'resources/js/ui'),
            },
        ],
    },
    server: {
        watch: {
            ignored: [
                '**/.agents/**',
                '**/.claude/**',
                '**/.cursor/**',
                '**/.junie/**',
                '**/vendor/**',
            ],
        },
    },
});
