import { z } from "zod"

const envSchema = z.object({
  BETTER_AUTH_SECRET: z.string().min(1, "Missing BETTER_AUTH_SECRET"),
  BETTER_AUTH_URL: z.string().url().optional(),
  NEXT_PUBLIC_CONVEX_URL: z.string().url().optional(),
  DATABASE_URL: z.string().min(1).optional(),
  NEXT_PUBLIC_APP_URL: z.string().url().optional(),
  MACHINE_PROVISIONING_SECRET: z.string().optional(),
  MACHINE_TOKEN_TTL_MS: z.coerce.number().optional(),
  FLEET_SYNC_SECRET: z.string().optional(),
  SMTP_ADDRESS: z.string().optional(),
  SMTP_PORT: z.coerce.number().optional(),
  SMTP_DOMAIN: z.string().optional(),
  SMTP_USERNAME: z.string().optional(),
  SMTP_PASSWORD: z.string().optional(),
  SMTP_AUTHENTICATION: z.string().optional(),
  SMTP_ENABLE_STARTTLS_AUTO: z.string().optional(),
  SMTP_TLS: z.string().optional(),
  MAILER_SENDER_EMAIL: z.string().optional(),
})

const parsed = envSchema.safeParse(process.env)

if (!parsed.success) {
  console.error("Failed to parse environment variables", parsed.error.flatten().fieldErrors)
  throw new Error("Invalid environment configuration")
}

export const env = {
  BETTER_AUTH_SECRET: parsed.data.BETTER_AUTH_SECRET,
  BETTER_AUTH_URL: parsed.data.BETTER_AUTH_URL ?? parsed.data.NEXT_PUBLIC_APP_URL ?? "http://localhost:3000",
  NEXT_PUBLIC_CONVEX_URL: parsed.data.NEXT_PUBLIC_CONVEX_URL,
  DATABASE_URL: parsed.data.DATABASE_URL,
  NEXT_PUBLIC_APP_URL: parsed.data.NEXT_PUBLIC_APP_URL,
  MACHINE_PROVISIONING_SECRET: parsed.data.MACHINE_PROVISIONING_SECRET,
  MACHINE_TOKEN_TTL_MS: parsed.data.MACHINE_TOKEN_TTL_MS,
  FLEET_SYNC_SECRET: parsed.data.FLEET_SYNC_SECRET,
  SMTP: parsed.data.SMTP_ADDRESS && parsed.data.SMTP_USERNAME && parsed.data.SMTP_PASSWORD
    ? {
        host: parsed.data.SMTP_ADDRESS,
        port: parsed.data.SMTP_PORT ?? 465,
        domain: parsed.data.SMTP_DOMAIN,
        username: parsed.data.SMTP_USERNAME,
        password: parsed.data.SMTP_PASSWORD,
        tls: (parsed.data.SMTP_TLS ?? "true").toLowerCase() === "true",
        starttls: (parsed.data.SMTP_ENABLE_STARTTLS_AUTO ?? "false").toLowerCase() === "true",
        auth: parsed.data.SMTP_AUTHENTICATION ?? "login",
        from: parsed.data.MAILER_SENDER_EMAIL ?? "no-reply@example.com",
      }
    : null,
}
