// vite.test.config.ts — Plan 01-11 two-bundle separation.
//
// Extends the production `./vite.config.ts` with the following delta knobs:
//   1. `mode: 'test'` — Vite statically replaces `import.meta.env.MODE`
//      everywhere in the input source with the string literal `'test'`.
//   2. `define: { __MOKOSH_UAT__: 'true' }` — the dedicated build-time
//      token gating the test-hook dynamic imports in
//      src/background/index.ts + src/offscreen/recorder.ts (Plan 01-11
//      Task 2). With this set to `true` the `if (__MOKOSH_UAT__)` branch
//      becomes a live branch and Rollup KEEPS the dynamic imports;
//      production builds (vite.config.ts sets it `false`) tree-shake
//      them away (verified by the Tier-1 grep gate
//      `tests/background/no-test-hooks-in-prod-bundle.test.ts`).
//   3. `build.outDir: 'dist-test'` + `emptyOutDir: true` — emit to a
//      SEPARATE directory so a `npm run build` immediately after this
//      build does not clobber. Puppeteer harness consumes this path via
//      `puppeteer.launch({ enableExtensions: [<abs-path-to-dist-test>] })`.
//   4. `build.modulePreload: { polyfill: false }` — CRITICAL SW FIX.
//      Vite's default module-preload polyfill calls
//      `document.getElementsByTagName` + `document.querySelector` at
//      module init in EVERY chunk that contains a dynamic import. The
//      production bundle has no dynamic imports (the test-hook gate is
//      dead code; tree-shaken). The test bundle HAS the dynamic
//      `await import('../test-hooks/sw-hooks')` — so the preload
//      polyfill gets included in the SW chunk. SWs have no DOM —
//      `document` is undefined — and the polyfill throws on the very
//      first await, killing the SW module init silently (no console
//      output, just a dead worker). Disabling the polyfill removes the
//      `document.*` references; modern Chrome (and our MV3 target ≥88)
//      supports native dynamic import without the polyfill.
//      Empirically verified: with the polyfill enabled, the test
//      bundle's SW never reaches `Service Worker initializing` log;
//      with it disabled, the SW initializes and chrome.runtime.onMessage
//      handlers respond. See Plan 01-11 PROTOTYPE research session.
//
// Plan 01-13 Wave 1: the extension-internal harness page at
// `tests/uat/extension-page-harness.html` is added as a Rollup input
// so the test build emits it under that path in `dist-test/`. The
// Puppeteer driver navigates the in-browser tab to
// `chrome-extension://<id>/tests/uat/extension-page-harness.html` and
// invokes `window.__mokoshHarness.*` from the host side via CDP. The
// page itself has full chrome.* extension privileges (Approach B
// architectural anchor). Production builds (vite.config.ts) do NOT
// include this input — the page ships only in the test bundle.
//
// References:
//   - Vite mergeConfig: https://vite.dev/guide/api-javascript.html#mergeconfig
//   - Vite environment variables: https://vite.dev/guide/env-and-mode.html
//   - Vite build.modulePreload: https://vite.dev/config/build-options.html#build-modulepreload
//   - Rollup multi-entry inputs: https://rollupjs.org/configuration-options/#input

import { defineConfig, mergeConfig, type UserConfigExport } from 'vite';
import baseConfig from './vite.config';

const baseAsExport: UserConfigExport = baseConfig;

export default defineConfig(({ command, mode }) =>
  mergeConfig(
    typeof baseAsExport === 'function'
      ? baseAsExport({ command, mode, isPreview: false, isSsrBuild: false })
      : baseAsExport,
    {
      mode: 'test',
      // `define` performs a static text replacement at build time. We use a
      // dedicated `__MOKOSH_UAT__` token (NOT `import.meta.env.MODE`) for the
      // hook-import gate because vitest defaults its mode to 'test' too —
      // gating on MODE would activate the hooks during unit tests and
      // overwrite their vi.fn() mocks for chrome.notifications.create etc.
      // The dedicated token is `false` everywhere except in this test bundle
      // (Plan 01-11 RESEARCH §6 augmented — keeps Vite tree-shake semantics
      // intact while sidestepping the vitest cross-contamination).
      // Reference: https://vite.dev/config/shared-options.html#define
      define: {
        __MOKOSH_UAT__: 'true',
      },
      build: {
        outDir: 'dist-test',
        emptyOutDir: true,
        // CRITICAL: see file header comment §4 — disables the
        // document.*-using module preload polyfill that crashes SW init.
        modulePreload: { polyfill: false },
        rollupOptions: {
          input: {
            // Plan 01-13 Wave 1: emit the extension-internal harness
            // page at its production path so it becomes reachable as
            // chrome-extension://<id>/tests/uat/extension-page-harness.html
            // The crxjs vite plugin will copy this HTML into dist-test/
            // and rewrite the <script type="module" src> reference to
            // the bundled chunk's hashed filename.
            extension_page_harness: 'tests/uat/extension-page-harness.html',
            // Plan 01-10 D-17-onboarding: mirror of vite.config.ts —
            // the harness A15/A16/A17 assertions navigate against the
            // test bundle and need welcome.html reachable under
            // dist-test/src/welcome/welcome.html.
            welcome: 'src/welcome/welcome.html',
          },
        },
      },
    },
  ),
);
