import { z } from 'zod'

const envSchema = z.object({
  DATABASE_URL: z.string().min(1, 'DATABASE_URL is required'),
  DIRECT_URL: z.string().optional(),
  SESSION_SECRET: z.string().min(32, 'SESSION_SECRET must be at least 32 characters'),
  NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
  // M11 (ST-1107) — gedeeld geheim tussen Vercel cron-trigger en
  // /api/cron/expire-questions. In productie verplicht; lokaal dev mag missen
  // (de cron-route geeft 401 als de header niet matcht).
  CRON_SECRET: z.string().optional(),
  // PBI-55 Web Push — alle vier .optional() zodat de app ook start zonder VAPID
  NEXT_PUBLIC_VAPID_PUBLIC_KEY: z.string().optional(),
  VAPID_PRIVATE_KEY: z.string().optional(),
  VAPID_SUBJECT: z
    .string()
    .refine(
      (v) => v.startsWith('mailto:') || z.string().email().safeParse(v).success,
      { message: 'VAPID_SUBJECT must start with mailto: or be a valid email' }
    )
    .optional(),
  INTERNAL_PUSH_SECRET: z.string().min(32).optional(),
  // PBI-66 — Anthropic API key voor scripts/sync-model-prices.ts.
  // Niet nodig in app-runtime, alleen bij het wekelijkse sync-script.
  ANTHROPIC_API_KEY: z.string().optional(),
})

const parsed = envSchema.safeParse(process.env)

if (!parsed.success) {
  console.error('❌ Invalid environment variables:')
  console.error(parsed.error.flatten().fieldErrors)
  throw new Error('Invalid environment variables. Check .env.local.')
}

export const env = parsed.data
