import dotenv from "dotenv";
import path from "path";

// .env 파일 로드
dotenv.config({ path: path.resolve(process.cwd(), ".env") });

interface Config {
  // 서버 설정
  port: number;
  host: string;
  nodeEnv: string;

  // 데이터베이스 설정
  databaseUrl: string;

  // JWT 설정
  jwt: {
    secret: string;
    expiresIn: string;
    refreshExpiresIn: string;
  };

  // 보안 설정
  bcryptRounds: number;
  sessionSecret: string;

  // CORS 설정
  cors: {
    origin: string | string[] | boolean; // 타입을 확장하여 배열과 boolean도 허용
    credentials: boolean;
  };

  // 로깅 설정
  logging: {
    level: string;
    file: string;
  };

  // API 설정
  apiPrefix: string;
  apiVersion: string;

  // 파일 업로드 설정
  maxFileSize: number;
  uploadDir: string;

  // 이메일 설정
  smtpHost: string;
  smtpPort: number;
  smtpUser: string;
  smtpPass: string;

  // Redis 설정
  redisUrl: string;

  // 개발 환경 설정
  debug: boolean;
  showErrorDetails: boolean;
}

// CORS origin 처리 함수
const getCorsOrigin = (): string[] | boolean => {
  // 개발 환경에서는 모든 origin 허용
  if (process.env.NODE_ENV === "development") {
    return true;
  }

  // 환경변수가 있으면 쉼표로 구분하여 배열로 변환
  if (process.env.CORS_ORIGIN) {
    return process.env.CORS_ORIGIN.split(",").map((origin) => origin.trim());
  }

  // 기본값: 허용할 도메인들
  return [
    "http://localhost:9771", // 로컬 개발 환경
    "http://192.168.0.70:5555", // 내부 네트워크 접근
    "http://39.117.244.52:5555", // 외부 네트워크 접근
    "https://v1.vexplor.com", // 운영 프론트엔드
    "https://api.vexplor.com", // 운영 백엔드
  ];
};

const config: Config = {
  // 서버 설정
  port: parseInt(process.env.PORT || "8080", 10),
  host: process.env.HOST || "0.0.0.0",
  nodeEnv: process.env.NODE_ENV || "development",

  // 데이터베이스 설정
  databaseUrl:
    process.env.DATABASE_URL ||
    "postgresql://postgres:postgres@localhost:5432/ilshin",

  // JWT 설정
  jwt: {
    secret: process.env.JWT_SECRET || "ilshin-plm-super-secret-jwt-key-2024",
    expiresIn: process.env.JWT_EXPIRES_IN || "24h",
    refreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || "7d",
  },

  // 보안 설정
  bcryptRounds: parseInt(process.env.BCRYPT_ROUNDS || "12", 10),
  sessionSecret: process.env.SESSION_SECRET || "ilshin-plm-session-secret-2024",

  // CORS 설정
  cors: {
    origin: getCorsOrigin(),
    credentials: true, // 쿠키 및 인증 정보 포함 허용
  },

  // 로깅 설정
  logging: {
    level: process.env.LOG_LEVEL || "info",
    file: process.env.LOG_FILE || "logs/app.log",
  },

  // API 설정
  apiPrefix: process.env.API_PREFIX || "/api",
  apiVersion: process.env.API_VERSION || "v1",

  // 파일 업로드 설정
  maxFileSize: parseInt(process.env.MAX_FILE_SIZE || "10485760", 10),
  uploadDir: process.env.UPLOAD_DIR || "uploads",

  // 이메일 설정
  smtpHost: process.env.SMTP_HOST || "smtp.gmail.com",
  smtpPort: parseInt(process.env.SMTP_PORT || "587", 10),
  smtpUser: process.env.SMTP_USER || "",
  smtpPass: process.env.SMTP_PASS || "",

  // Redis 설정
  redisUrl: process.env.REDIS_URL || "redis://localhost:6379",

  // 개발 환경 설정
  debug: process.env.DEBUG === "true",
  showErrorDetails: process.env.SHOW_ERROR_DETAILS === "true",
};

export default config;
