import dotenv from "dotenv";
import { z } from "zod";

dotenv.config();

const booleanFromEnv = z.preprocess((value) => {
  if (typeof value === "boolean") {
    return value;
  }

  if (typeof value === "string") {
    const normalized = value.trim().toLowerCase();
    if (["1", "true", "yes", "on"].includes(normalized)) {
      return true;
    }

    if (["0", "false", "no", "off", ""].includes(normalized)) {
      return false;
    }
  }

  return value;
}, z.boolean());

const envSchema = z.object({
  NODE_ENV: z.enum(["development", "test", "production"]).default("development"),
  API_PORT: z.coerce.number().default(4000),
  TCP_PORT: z.coerce.number().default(5001),
  DATABASE_URL: z.string().min(1),
  DB_MAX_CONNECTIONS: z.coerce.number().int().positive().max(50).default(10),
  DB_STATEMENT_TIMEOUT_MS: z.coerce.number().int().positive().default(15000),
  DB_QUERY_TIMEOUT_MS: z.coerce.number().int().positive().default(18000),
  DB_LOCK_TIMEOUT_MS: z.coerce.number().int().positive().default(3000),
  DB_IDLE_TRANSACTION_TIMEOUT_MS: z.coerce.number().int().positive().default(15000),
  DB_SLOW_QUERY_MS: z.coerce.number().int().positive().default(1000),
  REDIS_URL: z.string().min(1).optional(),
  JWT_SECRET: z.string().min(16),
  JWT_EXPIRES_IN: z.string().default("12h"),
  ADMIN_EMAIL: z.string().email(),
  ADMIN_PASSWORD: z.string().min(8),
  APP_BASE_URL: z.string().default("http://localhost:3000"),
  API_BASE_URL: z.string().default("http://localhost:4000"),
  WS_BASE_URL: z.string().default("http://localhost:4000"),
  TCP_IDLE_TIMEOUT_MS: z.coerce.number().default(180000),
  LOG_TCP_FRAMES: booleanFromEnv.default(false),
  LOG_TCP_FRAMES_VERBOSE: booleanFromEnv.default(false),
  LOG_TCP_FRAMES_FILE: z.string().default("/opt/tracker/tcp-frames.log"),
  LOG_TCP_FRAMES_RETENTION_DAYS: z.coerce.number().int().positive().default(90),
  DEVICE_ONLINE_SECONDS: z.coerce.number().default(90),
  DEVICE_DELAYED_SECONDS: z.coerce.number().default(300),
  SMTP_HOST: z.string().min(1).optional(),
  SMTP_PORT: z.coerce.number().default(587),
  SMTP_SECURE: booleanFromEnv.default(false),
  SMTP_USER: z.string().min(1).optional(),
  SMTP_PASSWORD: z.string().min(1).optional(),
  SMTP_FROM: z.string().email().optional(),
  TEST_MAIL_RECIPIENT: z.string().email().default("pr@visau.pl"),
  TRIP_BACKFILL_ON_START: booleanFromEnv.default(false),
  TRIP_BACKFILL_DAYS: z.coerce.number().int().positive().max(31).default(2),
});

export const env = envSchema.parse(process.env);
