# mlink-backend/src/config/env_loader.py
import os
from typing import Optional, Any
from dotenv import load_dotenv
import logging

class EnvLoader:
    """환경 변수 로딩 및 검증 클래스"""
    
    def __init__(self, env_file: str = None):
        # 프로젝트 루트 디렉토리 찾기 (mlink-backend의 상위 디렉토리)
        # env_loader.py 경로: mlink-backend/src/config/env_loader.py
        # 4번 dirname: config -> src -> mlink-backend -> 프로젝트 루트
        self.project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
        
        if env_file:
            self.env_file = env_file
        else:
            # 먼저 .env 파일에서 ENVIRONMENT 값 읽기
            main_env_file = os.path.join(self.project_root, '.env')
            if os.path.exists(main_env_file):
                # .env 파일에서 ENVIRONMENT만 읽기
                load_dotenv(main_env_file, override=False)
                environment = os.getenv('ENVIRONMENT', 'development').lower()
            else:
                logging.warning(f"메인 환경 변수 파일을 찾을 수 없음: {main_env_file}, 기본값 'development' 사용")
                environment = 'development'
            
            # ENVIRONMENT 값에 따라 실제 환경 파일 선택
            if environment == 'production':
                self.env_file = os.path.join(self.project_root, '.env.production')
            else:
                self.env_file = os.path.join(self.project_root, '.env.development')
        
        self._load_env()
        self._validate_required_vars()
    
    def _load_env(self):
        """환경 변수 파일 로드"""
        if os.path.exists(self.env_file):
            load_dotenv(self.env_file, override=True)
            logging.info(f"환경 변수 파일 로드됨: {self.env_file}")
        else:
            logging.warning(f"환경 변수 파일을 찾을 수 없음: {self.env_file}")
    
    def _validate_required_vars(self):
        """필수 환경 변수 검증"""
        required_vars = [
            'OPENAI_API_KEY',
            'SECRET_KEY',
            'FLASK_APP'
        ]
        
        missing_vars = []
        for var in required_vars:
            if not os.getenv(var):
                missing_vars.append(var)
        
        if missing_vars:
            raise ValueError(f"필수 환경 변수가 누락됨: {', '.join(missing_vars)}")
    
    def get(self, key: str, default: Any = None, required: bool = False) -> Any:
        """환경 변수 값 가져오기"""
        value = os.getenv(key, default)
        
        if required and value is None:
            raise ValueError(f"필수 환경 변수 '{key}'가 설정되지 않음")
        
        return value
    
    def get_bool(self, key: str, default: bool = False) -> bool:
        """불린 환경 변수 값 가져오기"""
        value = os.getenv(key, str(default)).lower()
        return value in ('true', '1', 'yes', 'on')
    
    def get_int(self, key: str, default: int = 0) -> int:
        """정수 환경 변수 값 가져오기"""
        try:
            return int(os.getenv(key, str(default)))
        except ValueError:
            return default
    
    def get_list(self, key: str, separator: str = ',', default: list = None) -> list:
        """리스트 환경 변수 값 가져오기"""
        value = os.getenv(key, '')
        if not value:
            return default or []
        return [item.strip() for item in value.split(separator)]
    
    @property
    def is_development(self) -> bool:
        """개발 환경 여부"""
        return self.get('ENVIRONMENT', 'development').lower() == 'development'
    
    @property
    def is_production(self) -> bool:
        """프로덕션 환경 여부"""
        return self.get('ENVIRONMENT', 'development').lower() == 'production'

# 전역 인스턴스
env = EnvLoader()