import path from 'path';
import dotenv from 'dotenv';

dotenv.config({ path: path.resolve(__dirname, '../../.env') });

export interface AppConfig {
  port: number;
  nodeEnv: string;
  databaseUrl: string;
  jwtSecret: string;
  jwtExpiresIn: string;
  loginOtpExpiryMinutes: number;
  maxLoginAttempts: number;
  loginCooldownMinutes: number;
  smtpHost: string;
  smtpPort: number;
  smtpUser: string;
  smtpPass: string;
  emailFrom: string;
  redisHost: string;
  redisPort: number;
  redisPassword: string;
  redisDb: number;
  attendanceApiKey: string;
  calendarApiKey: string;
  companyTimezone: string;
  frontendUrl: string;
}

export class ConfigSingleton {
  private static instance: AppConfig;

  private constructor() {}

  static getInstance(): AppConfig {
    if (!ConfigSingleton.instance) {
      const jwtSecret = process.env.JWT_SECRET;
      const databaseUrl = process.env.DATABASE_URL;
      if (!jwtSecret) throw new Error('JWT_SECRET is required');
      if (!databaseUrl) throw new Error('DATABASE_URL is required');

      ConfigSingleton.instance = {
        port: parseInt(process.env.PORT || '3000', 10),
        nodeEnv: process.env.NODE_ENV || 'development',
        databaseUrl,
        jwtSecret,
        jwtExpiresIn: process.env.JWT_EXPIRES_IN || '8h',
        loginOtpExpiryMinutes: Math.min(
          parseInt(process.env.LOGIN_OTP_EXPIRY_MINUTES || '10', 10),
          10,
        ),
        maxLoginAttempts: parseInt(process.env.MAX_LOGIN_ATTEMPTS || '5', 10),
        loginCooldownMinutes: parseInt(process.env.LOGIN_COOLDOWN_MINUTES || '15', 10),
        smtpHost: process.env.SMTP_HOST || '',
        smtpPort: parseInt(process.env.SMTP_PORT || '587', 10),
        smtpUser: process.env.SMTP_USER || '',
        smtpPass: process.env.SMTP_PASS || '',
        emailFrom: process.env.EMAIL_FROM || 'noreply@example.com',
        redisHost: process.env.REDIS_HOST || '127.0.0.1',
        redisPort: parseInt(process.env.REDIS_PORT || '6379', 10),
        redisPassword: process.env.REDIS_PASSWORD || '',
        redisDb: parseInt(process.env.REDIS_DB || '0', 10),
        attendanceApiKey: process.env.ATTENDANCE_API_KEY || 'dev-attendance-key',
        calendarApiKey: process.env.CALENDAR_API_KEY || 'dev-calendar-key',
        companyTimezone: process.env.COMPANY_TIMEZONE || 'Asia/Kolkata',
        frontendUrl: process.env.FRONTEND_URL || 'http://localhost:4200',
      };
    }
    return ConfigSingleton.instance;
  }
}
