import { defineConfig, UserConfig, Plugin } from "vite";
import vue from "@vitejs/plugin-vue";
import dotenv from "dotenv";
import { loadAppConfig } from "./vite.config.utils.mts";
import path from "path";
import { fileURLToPath } from 'url';

// Load environment variables
dotenv.config();

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

export async function createBuildConfig(mode: string): Promise<UserConfig> {
  const appConfig = await loadAppConfig();
  const isElectron = mode === "electron";
  const isCapacitor = mode === "capacitor";
  const isPyWebView = mode === "pywebview";

  // Explicitly set platform and disable PWA for Electron
  process.env.VITE_PLATFORM = mode;
  process.env.VITE_PWA_ENABLED = isElectron ? 'false' : 'true';
  process.env.VITE_DISABLE_PWA = isElectron ? 'true' : 'false';

  if (isElectron || isPyWebView || isCapacitor) {
    process.env.VITE_PWA_ENABLED = 'false';
  }

  return {
    base: isElectron || isPyWebView ? "./" : "/",
    plugins: [vue()],
    server: {
      port: parseInt(process.env.VITE_PORT || "8080"),
      fs: { strict: false },
    },
    build: {
      outDir: isElectron ? "dist-electron" : "dist",
      assetsDir: 'assets',
      chunkSizeWarningLimit: 1000,
      rollupOptions: {
        external: isCapacitor 
          ? ['@capacitor/app'] 
          : [],
        output: {
          format: 'esm',
          generatedCode: {
            preset: 'es2015'
          },
          manualChunks: undefined
        }
      }
    },
    worker: {
      format: 'es',
      plugins: () => []
    },
    define: {
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
      'process.env.VITE_PLATFORM': JSON.stringify(mode),
      'process.env.VITE_PWA_ENABLED': JSON.stringify(!isElectron),
      'process.env.VITE_DISABLE_PWA': JSON.stringify(isElectron),
      __dirname: isElectron ? JSON.stringify(process.cwd()) : '""',
      __IS_MOBILE__: JSON.stringify(isCapacitor),
      __USE_QR_READER__: JSON.stringify(!isCapacitor),
      'process.platform': JSON.stringify('browser'),
      'process.version': JSON.stringify('v16.0.0'),
      'process.env.NODE_DEBUG': JSON.stringify(false),
      'global.process': JSON.stringify({
        platform: 'browser',
        version: 'v16.0.0',
        env: { NODE_DEBUG: false }
      })
    },
    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src'),
        ...appConfig.aliasConfig,
        'path': path.resolve(__dirname, './src/utils/node-modules/path.js'),
        'fs': path.resolve(__dirname, './src/utils/node-modules/fs.js'),
        'crypto': path.resolve(__dirname, './src/utils/node-modules/crypto.js'),
        'nostr-tools/nip06': mode === 'development' 
          ? 'nostr-tools/nip06'
          : path.resolve(__dirname, 'node_modules/nostr-tools/nip06'),
        'nostr-tools/core': mode === 'development'
          ? 'nostr-tools'
          : path.resolve(__dirname, 'node_modules/nostr-tools'),
        'nostr-tools': path.resolve(__dirname, 'node_modules/nostr-tools'),
        'dexie-export-import': path.resolve(__dirname, 'node_modules/dexie-export-import')
      }
    },
    optimizeDeps: {
      include: [
        'nostr-tools', 
        'nostr-tools/nip06', 
        'nostr-tools/core', 
        'dexie-export-import',
        '@jlongster/sql.js'
      ],
      exclude: isElectron ? [
        'register-service-worker',
        'workbox-window',
        'web-push',
        'serviceworker-webpack-plugin',
        'vite-plugin-pwa',
        '@vite-pwa/vue'
      ] : []
    }
  };
}

export default defineConfig(async () => createBuildConfig('web'));