import os
from functools import lru_cache
from pathlib import Path

from pydantic_settings import BaseSettings, SettingsConfigDict

from common_logging import get_logger

logger = get_logger(__name__)

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

_this = Path(__file__).resolve()
_PROJECT_ROOT = Path(os.environ.get('PROJECT_ROOT', str(_this.parents[min(3, len(_this.parents) - 1)])))
_DATA_ROOT = Path(os.environ.get('DATA_ROOT', str(_PROJECT_ROOT / 'data_center' / 'data')))

class Settings(BaseSettings):
    model_config = SettingsConfigDict(env_file=_ENV_FILE, env_file_encoding='utf-8', case_sensitive=False, extra='ignore')
    app_name: str = 'Tax Data Center'
    app_version: str = '1.0.0'
    debug: bool = False
    log_level: str = 'INFO'
    database_url: str
    database_schema: str = 'data_center'
    redis_url: str = 'redis://localhost:6379/0'
    celery_broker_url: str = 'redis://localhost:6379/0'
    celery_result_backend: str = 'redis://localhost:6379/0'
    celery_task_queue: str = 'data_center_queue'
    base_platform_url: str = 'http://localhost:8000'
    base_platform_api_key: str | None = None
    internal_api_token: str | None = None
    base_platform_kb_id: int = 1
    base_platform_category_map: str = ''

    @property
    def kb_category_id_map(self) -> dict[int, int]:
        if not self.base_platform_category_map.strip():
            return {}
        result = {}
        for pair in self.base_platform_category_map.split(','):
            pair = pair.strip()
            if ':' in pair:
                left, right = pair.split(':', 1)
                try:
                    result[int(left.strip())] = int(right.strip())
                except ValueError:
                    logger.warning(f"failed to parse category map pair: {pair}")
        return result
    crawler_delay_min: int = 1
    crawler_delay_max: int = 5
    crawler_max_concurrent: int = 5
    crawler_request_timeout: int = 30
    crawler_max_retries: int = 3
    minio_bucket: str = 'knowledge-documents'
    minio_prefix: str = 'tax-data-center'
    data_root: str = str(_DATA_ROOT)

    @property
    def project_root(self) -> Path:
        return _PROJECT_ROOT

    @property
    def raw_data_dir(self) -> Path:
        return Path(self.data_root) / 'chinatax_policy' / 'raw'

    @property
    def processed_data_dir(self) -> Path:
        return Path(self.data_root) / 'chinatax_policy' / 'processed'
    http_proxy: str | None = None
    https_proxy: str | None = None

    @property
    def database_url_with_schema(self) -> str:
        return f'{self.database_url}?options=-c%20search_path={self.database_schema},public'

@lru_cache
def get_settings() -> Settings:
    s = Settings()
    logger.info(f"configuration loaded from {_ENV_FILE}")
    return s
settings = get_settings()
