import { z } from 'zod';

const bool = z.string().default('false').transform((value) => value === 'true');

const schema = z.object({
  NODE_ENV: z.enum(['development', 'test', 'production']).default('development'),
  APP_NAME: z.string().default('سامانه تحویل کالای بازرگانی ماندگار'),
  APP_URL: z.string().url().default('http://localhost:3000'),
  PORT: z.coerce.number().int().positive().default(3000),
  TRUST_PROXY: z.coerce.number().int().min(0).default(0),
  APP_TIMEZONE: z.string().default('Asia/Tehran'),
  APP_KEY: z.string().min(32).default('development-app-key-change-this-32chars'),
  SESSION_SECRET: z.string().min(32).default('development-session-secret-change-it'),
  SESSION_COOKIE_NAME: z.string().default('mandegar_session'),
  DATABASE_DRIVER: z.enum(['postgres', 'pglite']).default('pglite'),
  DATABASE_URL: z.string().default('postgresql://mandegar:mandegar@localhost:5432/mandegar'),
  PGLITE_DATA_DIR: z.string().default('storage/pglite'),
  REDIS_URL: z.string().default('redis://localhost:6379'),
  REDIS_REQUIRED: bool,
  QUEUE_DRIVER: z.enum(['database', 'redis']).default('database'),
  LOG_LEVEL: z.string().default('info'),
  MAX_UPLOAD_MB: z.coerce.number().positive().default(20),
  IMPORT_QUEUE_THRESHOLD_ROWS: z.coerce.number().int().positive().default(5000),
  VAPID_SUBJECT: z.string().default('mailto:admin@example.com'),
  VAPID_PUBLIC_KEY: z.string().default(''),
  VAPID_PRIVATE_KEY: z.string().default(''),
  SECURE_COOKIES: bool,
  LOGIN_MAX_ATTEMPTS: z.coerce.number().int().positive().default(5),
  LOGIN_WINDOW_MINUTES: z.coerce.number().int().positive().default(15)
  ,SEED_DEMO_USERS: bool
});

export type AppEnv = z.infer<typeof schema>;

export function loadEnv(source: NodeJS.ProcessEnv = process.env): AppEnv {
  const result = schema.safeParse(source);
  if (!result.success) {
    const messages = result.error.issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`).join('\n');
    throw new Error(`پیکربندی محیط نامعتبر است:\n${messages}`);
  }
  if (result.data.NODE_ENV === 'production') {
    if (result.data.APP_KEY.includes('development') || result.data.SESSION_SECRET.includes('development')) {
      throw new Error('کلیدهای پیش‌فرض توسعه در محیط تولید مجاز نیستند.');
    }
    if (!result.data.SECURE_COOKIES) {
      throw new Error('در محیط تولید SECURE_COOKIES باید true باشد.');
    }
    if (!result.data.REDIS_REQUIRED) {
      throw new Error('در محیط تولید REDIS_REQUIRED باید true باشد تا session، صف و هماهنگی بلادرنگ امن بماند.');
    }
  }
  return result.data;
}
