import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import { execSync } from 'node:child_process';
import tokens from './src/lib/styles/tokens.json' with { type: 'json' };

const THEME_DARK = tokens.colors.dark.obsidian;
const THEME_LIGHT = tokens.colors.light.obsidian;

const tokensPlugin = {
  name: 'minstrel-tokens',
  buildStart() {
    execSync('node scripts/tokens-to-css.js', { stdio: 'inherit' });
  }
};

// Build-only plugin that injects Go html/template tokens into the
// rendered index.html so the runtime Go server can substitute per-
// instance branding. In dev (`vite dev`), the marker stays as a
// comment and the SPA falls back to the literal app.html title.
// `enforce: 'post'` ensures this runs after SvelteKit's own
// transformIndexHtml so %sveltekit.head% is already expanded into
// hydration markup before our anchors are rewritten.
const injectGoTokensPlugin = {
  name: 'minstrel-inject-go-tokens',
  apply: 'build' as const,
  enforce: 'post' as const,
  transformIndexHtml(html: string) {
    const titleTag = `<title>{{ .AppName }}</title>`;
    const headBlock = `
    <meta name="description" content="{{ .Description }}">
    <meta property="og:title" content="{{ .AppName }}">
    <meta property="og:description" content="{{ .Description }}">
    <meta property="og:image" content="/brand/og-image.png">
    <meta property="og:type" content="website">
    <meta name="twitter:card" content="summary_large_image">
    <meta name="theme-color" media="(prefers-color-scheme: dark)" content="${THEME_DARK}">
    <meta name="theme-color" media="(prefers-color-scheme: light)" content="${THEME_LIGHT}">
    <script>window.__MINSTREL__ = { appName: "{{ .AppName }}" };</script>`;

    // Fail loudly if either anchor drifts. A silent .replace() no-op
    // would ship a build with un-substituted Go template tokens missing,
    // and the runtime brand override would silently break — exactly the
    // class of regression a build-time plugin should catch.
    if (!html.includes('<title>Minstrel</title>')) {
      throw new Error('minstrel-inject-go-tokens: <title>Minstrel</title> anchor missing from rendered index.html');
    }
    if (!html.includes('<!-- MINSTREL_TOKENS -->')) {
      throw new Error('minstrel-inject-go-tokens: <!-- MINSTREL_TOKENS --> anchor missing from app.html');
    }
    return html
      .replace('<title>Minstrel</title>', titleTag)
      .replace('<!-- MINSTREL_TOKENS -->', headBlock);
  }
};

export default defineConfig({
  plugins: [tokensPlugin, sveltekit(), injectGoTokensPlugin],
  server: {
    port: 5173,
    proxy: {
      '/api': {
        target: 'http://localhost:4533',
        changeOrigin: true
      },
      '/rest': {
        target: 'http://localhost:4533',
        changeOrigin: true
      }
    }
  }
});
