// ABOUTME: Application configuration loaded from environment variables
// ABOUTME: Validates config schema with Zod and provides typed access to all settings

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

dotenv.config();

const configSchema = z.object({
  database: z.object({
    url: z.string().url(),
  }),
  redis: z.object({
    url: z.string().url(),
  }),
  tabApi: z.object({
    baseUrl: z.string().url(),
    apiKey: z.string().optional(),
  }),
  scheduling: z.object({
    morningScrapeCron: z.string(),
    timezone: z.string(),
  }),
  rateLimiting: z.object({
    perMinute: z.number().int().positive(),
    retryAttempts: z.number().int().nonnegative(),
    retryDelayMs: z.number().int().positive(),
  }),
  features: z.object({
    enableHarnessRacing: z.boolean(),
    enableThoroughbredRacing: z.boolean(),
    enableAusRacing: z.boolean(),
    enableNzRacing: z.boolean(),
  }),
  logging: z.object({
    level: z.enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal']),
  }),
  observability: z.object({
    metricsPort: z.number().int().positive().optional(),
  }).optional(),
  env: z.enum(['development', 'production', 'test']),
});

const config = configSchema.parse({
  database: {
    url: process.env.DATABASE_URL!,
  },
  redis: {
    url: process.env.REDIS_URL || 'redis://localhost:6379',
  },
  tabApi: {
    baseUrl: process.env.TAB_API_BASE_URL!,
    apiKey: process.env.TAB_API_KEY,
  },
  scheduling: {
    morningScrapeCron: process.env.MORNING_SCRAPE_CRON || '0 6 * * *',
    timezone: process.env.TIMEZONE || 'Pacific/Auckland',
  },
  rateLimiting: {
    perMinute: parseInt(process.env.API_RATE_LIMIT_PER_MINUTE || '100', 10),
    retryAttempts: parseInt(process.env.API_RETRY_ATTEMPTS || '3', 10),
    retryDelayMs: parseInt(process.env.API_RETRY_DELAY_MS || '1000', 10),
  },
  features: {
    enableHarnessRacing: process.env.ENABLE_HARNESS_RACING === 'true',
    enableThoroughbredRacing: process.env.ENABLE_THOROUGHBRED_RACING === 'true',
    enableAusRacing: process.env.ENABLE_AUS_RACING === 'true',
    enableNzRacing: process.env.ENABLE_NZ_RACING === 'true',
  },
  logging: {
    level: (process.env.LOG_LEVEL || 'info') as 'info',
  },
  observability: {
    metricsPort: parseInt(process.env.METRICS_PORT || '9090', 10),
  },
  env: (process.env.NODE_ENV || 'development') as 'development',
});

export default config;
