import json
import os
from pathlib import Path
from typing import Any

_ENV_FILE = f".env.{os.environ.get('APP_ENV', 'development')}"

from pydantic import field_validator
from pydantic_settings import BaseSettings

from common_logging import get_logger

logger = get_logger(__name__)

_this = Path(__file__).resolve()
PROJECT_ROOT = Path(os.environ.get('PROJECT_ROOT', str(_this.parents[min(4, len(_this.parents) - 1)])))
LLM_SERVICE_DIR = Path(os.environ.get('LLM_SERVICE_DIR', str(PROJECT_ROOT / 'llm_service')))
DEFAULT_BASE_MODELS_DIR = LLM_SERVICE_DIR / 'base_models'
DEFAULT_TRAINED_MODELS_DIR = LLM_SERVICE_DIR / 'trained_models'

class Settings(BaseSettings):
    DATABASE_URL: str
    SECRET_KEY: str
    ENABLE_MOCK_TRAINING: bool = False
    DEFAULT_TRAINING_PLATFORM: str = 'qwen_local'
    VOLCENGINE_ACCESS_KEY: str = ''
    VOLCENGINE_SECRET_KEY: str = ''
    VOLCENGINE_REGION: str = 'cn-beijing'
    ALIYUN_ACCESS_KEY: str = ''
    ALIYUN_SECRET_KEY: str = ''
    ALIYUN_REGION: str = 'cn-hangzhou'
    QWEN_LOCAL_TRAINING_BASE_DIR: str = str(DEFAULT_TRAINED_MODELS_DIR)
    QWEN_LOCAL_MODEL_CACHE_DIR: str = str(DEFAULT_BASE_MODELS_DIR)
    QWEN_LOCAL_MAX_CONCURRENT_JOBS: int = 1
    QWEN_LOCAL_MAX_MEMORY_GB: int = 28
    QWEN_LOCAL_MIN_FREE_MEMORY_GB: int = 6
    QWEN_LOCAL_LOW_MEMORY_MODE: bool = True
    QWEN_LOCAL_DEFAULT_MAX_SEQ_LENGTH: int = 1024
    TRAINING_CENTER_UVICORN_RELOAD: bool = False

    CORS_ORIGINS: list[str] = ["http://localhost:8500", "http://localhost:8888"]

    @field_validator('CORS_ORIGINS', mode='before')
    @classmethod
    def parse_cors_origins(cls, v: Any) -> Any:
        if isinstance(v, str):
            return json.loads(v)
        return v

    class Config:
        env_file = _ENV_FILE
settings = Settings()

logger.info("Configuration loaded")
