/**
 * Vite Configuration
 *
 * Configures:
 * - Cross-origin isolation headers (required for OPFS/SQLite)
 * - Worker bundling
 */

import { defineConfig } from 'vite';

export default defineConfig({
  // Development server configuration
  server: {
    headers: {
      // Required for OPFS (Origin Private File System) access
      'Cross-Origin-Opener-Policy': 'same-origin',
      'Cross-Origin-Embedder-Policy': 'require-corp',
    },
  },

  // Preview server (npm run preview) configuration
  preview: {
    headers: {
      'Cross-Origin-Opener-Policy': 'same-origin',
      'Cross-Origin-Embedder-Policy': 'require-corp',
    },
  },

  // Build configuration
  build: {
    // Generate source maps for debugging
    sourcemap: true,

    // Target modern browsers that support OPFS
    target: 'esnext',

    // Raise the chunk-size warning threshold.
    // Rationale: the two largest chunks are unavoidable —
    //   • openlayers (~535 kB / ~152 kB gzipped) — the OL library itself,
    //     used app-wide; further splitting just creates more HTTP round-trips
    //   • sqlite3.wasm (~856 kB) — a runtime WASM binary, not a JS chunk;
    //     code-splitting does not apply
    // 900 kB silences the noise without hiding genuine regressions.
    chunkSizeWarningLimit: 900,

    rollupOptions: {
      output: {
        manualChunks(id) {
          // pako (zlib) is pulled in by BOTH geotiff and jspdf (via fast-png).
          // Without its own chunk, Rollup assigns it to one of them and the two
          // chunks reference each other ("Circular chunk: jspdf -> geotiff").
          if (id.includes('node_modules/pako/')) return 'pako';
          // Turf.js — only needed when the Analysis panel is opened, which
          // main.js imports dynamically. Keep it out of the eager bundle.
          if (id.includes('node_modules/@turf/')) return 'turf';
          // geotiff.js + the OL modules that use it — only needed when the user
          // opens a Cloud-Optimized GeoTIFF layer, which MapView.addCOGLayer()
          // imports dynamically. Must be tested BEFORE the generic ol/ rule so
          // it isn't swallowed into the eagerly-loaded openlayers chunk.
          if (id.includes('node_modules/geotiff/') ||
              id.includes('node_modules/ol/source/GeoTIFF') ||
              id.includes('node_modules/ol/layer/WebGLTile')) return 'geotiff';
          if (id.includes('node_modules/ol/')) return 'openlayers';
          if (id.includes('node_modules/ol-ext/')) return 'ol-ext';
          if (id.includes('node_modules/bootstrap/')) return 'bootstrap';
          // shpjs (+ its jszip dependency) — dynamically imported at runtime,
          // so this chunk is only fetched when the user imports a shapefile.
          if (id.includes('node_modules/shpjs/') || id.includes('node_modules/jszip/')) return 'shpjs';
          if (id.includes('node_modules/jspdf')) return 'jspdf';
        },
      },
    },
  },

  // Worker configuration
  worker: {
    format: 'es',
  },

  // Dependency optimization
  optimizeDeps: {
    exclude: ['sqlocal'],
  },
});
