/**
 * @file vite.config.web.mts
 * @description Vite configuration for web platform builds
 * 
 * This configuration file defines how the application is built for web platforms.
 * It extends the base configuration with web-specific settings and optimizations.
 * 
 * Build Process Integration:
 * 1. Configuration Loading:
 *    - Loads environment variables based on build mode
 *    - Merges base configuration from vite.config.common.mts
 *    - Loads application-specific configuration
 * 
 * 2. Platform Definition:
 *    - Sets VITE_PLATFORM environment variable to 'web'
 *    - Used by PlatformServiceFactory to load web-specific implementations
 * 
 * 3. Build Output:
 *    - Outputs to 'dist/web' directory
 *    - Creates vendor chunk for Vue-related dependencies
 *    - Enables PWA features with auto-update capability
 * 
 * 4. Development vs Production:
 *    - Development: Enables source maps and development features
 *    - Production: Optimizes chunks and enables PWA features
 * 
 * Usage:
 * - Development: npm run dev
 * - Production: npm run build:web
 * 
 * @see vite.config.common.mts
 * @see vite.config.utils.mts
 * @see PlatformServiceFactory.ts
 */

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import baseConfig from "./vite.config.base";

// Define Node.js built-in modules that need browser compatibility
const nodeBuiltins = {
  stream: 'stream-browserify',
  util: 'util',
  crypto: 'crypto-browserify',
  http: 'stream-http',
  https: 'https-browserify',
  zlib: 'browserify-zlib',
  url: 'url',
  assert: 'assert',
  path: 'path-browserify',
  fs: 'browserify-fs',
  tty: 'tty-browserify'
};

export default defineConfig({
  ...baseConfig,
  plugins: [vue()],
  optimizeDeps: {
    ...baseConfig.optimizeDeps,
    include: [...(baseConfig.optimizeDeps?.include || []), 'qrcode.vue'],
    exclude: Object.keys(nodeBuiltins),
    esbuildOptions: {
      define: {
        global: 'globalThis'
      }
    }
  },
  resolve: {
    ...baseConfig.resolve,
    alias: {
      ...baseConfig.resolve?.alias,
      ...nodeBuiltins
    }
  },
  build: {
    ...baseConfig.build,
    commonjsOptions: {
      ...baseConfig.build?.commonjsOptions,
      include: [/node_modules/],
      exclude: [/src\/services\/platforms\/electron/],
      transformMixedEsModules: true
    },
    rollupOptions: {
      ...baseConfig.build?.rollupOptions,
      external: Object.keys(nodeBuiltins),
      output: {
        ...baseConfig.build?.rollupOptions?.output,
        globals: nodeBuiltins
      }
    }
  }
});