import { sentrySvelteKit } from '@sentry/sveltekit';
import { paraglideVitePlugin } from '@inlang/paraglide-js';
import devtoolsJson from 'vite-plugin-devtools-json';
import tailwindcss from '@tailwindcss/vite';
import { defineConfig } from 'vitest/config';
import { playwright } from '@vitest/browser-playwright';
import { sveltekit } from '@sveltejs/kit/vite';
import { viteStaticCopy } from 'vite-plugin-static-copy';

export default defineConfig({
	optimizeDeps: {
		include: ['pdfjs-dist', '@tiptap/core', '@tiptap/starter-kit', '@tiptap/extension-mention']
	},
	server: {
		host: '0.0.0.0', // Erlaubt Zugriff von außen
		port: 5173, // Standard SvelteKit Port
		// Proxy für API-Aufrufe während der Entwicklung (Browser -> Vite -> Spring Boot)
		proxy: {
			'/api': {
				target: process.env.API_PROXY_TARGET || 'http://localhost:8080',
				changeOrigin: true
				// The browser forwards the fa_session cookie to the backend automatically;
				// no header injection needed (ADR-020).
			}
		}
	},
	plugins: [
		sentrySvelteKit({
			org: 'familienarchiv',
			project: 'frontend',
			authToken: process.env.SENTRY_AUTH_TOKEN,
			sentryUrl: (() => {
				const dsn = process.env.VITE_SENTRY_DSN;
				if (!dsn) return undefined;
				try {
					return new URL(dsn).origin;
				} catch {
					return undefined;
				}
			})(),
			autoUploadSourceMaps: !!process.env.SENTRY_AUTH_TOKEN
		}),
		tailwindcss(),
		sveltekit(),
		devtoolsJson(),
		// pdf.js 5.x decodes JBIG2 / CCITTFax / JPEG2000 images in WebAssembly.
		// Serve the wasm from our own origin at /pdfjs-wasm/ (referenced by
		// getDocument's wasmUrl) — emitted into build/client/ so it survives the
		// production Docker image, not just `npm run dev`. See issue #708.
		viteStaticCopy({
			targets: [
				{ src: 'node_modules/pdfjs-dist/wasm/*', dest: 'pdfjs-wasm', rename: { stripBase: true } }
			]
		}),
		paraglideVitePlugin({
			project: './project.inlang',
			outdir: './src/lib/paraglide'
		})
	],
	test: {
		expect: { requireAssertions: true },
		coverage: {
			provider: 'v8',
			reporter: ['text', 'lcov'],
			reportsDirectory: 'coverage/server',
			// Measure utility and server-side logic only. Svelte components run
			// in the browser project and are excluded here. Browser-only TS files
			// (actions, hooks, domain-specific UI state) are also excluded.
			// person/ is excluded until relationshipLabels.ts coverage is raised.
			include: [
				'src/lib/shared/utils/**',
				'src/lib/shared/server/**',
				'src/lib/shared/discussion/**',
				'src/lib/document/**',
				'src/lib/timeline/**',
				'src/hooks.server.ts'
			],
			exclude: [
				'**/*.svelte',
				'**/*.svelte.ts',
				'**/__mocks__/**',
				// Tiptap NodeView — builds live ProseMirror DOM and only runs inside
				// the browser editor, so it is exercised by the client project's
				// browser tests, not this node server-coverage run. Browser-only UI
				// .ts file, excluded like the actions/hooks this config measures around.
				'src/lib/shared/discussion/mentionNodeView.ts'
			],
			thresholds: {
				lines: 80,
				functions: 80,
				branches: 80,
				statements: 80
			}
		},
		projects: [
			{
				extends: './vite.config.ts',
				test: {
					name: 'client',
					browser: {
						enabled: true,
						provider: playwright(),
						instances: [{ browser: 'chromium', headless: true }],
						screenshotDirectory: 'test-results/screenshots',
						screenshotFailures: true
					},
					setupFiles: ['./src/test-setup.ts'],
					include: ['src/**/*.svelte.{test,spec}.{js,ts}'],
					exclude: ['src/lib/server/**']
				}
			},
			{
				extends: './vite.config.ts',
				test: {
					name: 'server',
					environment: 'node',
					include: ['src/**/*.{test,spec}.{js,ts}'],
					exclude: ['src/**/*.svelte.{test,spec}.{js,ts}']
				}
			}
		]
	}
});
