"""
InnoCore AI 核心配置模块
"""

from typing import Dict, List, Optional, Any
from dataclasses import dataclass, field
from enum import Enum
import os
from dotenv import load_dotenv

load_dotenv()

class LLMProvider(Enum):
    """LLM提供商枚举"""
    OPENAI = "openai"
    CLAUDE = "claude"
    MODELSCOPE = "modelscope"  # 阿里云 ModelScope
    OLLAMA = "ollama"  # 本地部署
    DASHSCOPE = "dashscope"  # 阿里云灵积（推荐用于 Qwen 系列）

class VectorDBType(Enum):
    """向量数据库类型枚举"""
    QDRANT = "qdrant"
    CHROMA = "chroma"
    PINECONE = "pinecone"

@dataclass
class LLMConfig:
    """LLM配置"""
    provider: LLMProvider = LLMProvider.OPENAI
    model_name: str = "gpt-3.5-turbo"  # OpenAI: gpt-4, gpt-3.5-turbo, gpt-4-turbo-preview
                                        # DashScope: qwen-turbo, qwen-plus, qwen-max
                                        # ModelScope: qwen/Qwen2.5-7B-Instruct
    api_key: Optional[str] = None
    base_url: Optional[str] = None
    temperature: float = 0.7
    max_tokens: int = 4000
    timeout: int = 60

@dataclass
class VectorDBConfig:
    """向量数据库配置"""
    db_type: VectorDBType = VectorDBType.QDRANT
    host: str = "localhost"
    port: int = 6333
    api_key: Optional[str] = None
    collection_name_prefix: str = "innocore"
    embedding_model: str = "text-embedding-3-small"

@dataclass
class DatabaseConfig:
    """关系数据库配置"""
    host: str = "localhost"
    port: int = 5432
    database: str = "innocore_ai"
    username: str = "postgres"
    password: str = "password"
    pool_size: int = 10

@dataclass
class RedisConfig:
    """Redis配置"""
    host: str = "localhost"
    port: int = 6379
    db: int = 0
    password: Optional[str] = None
    max_connections: int = 20

@dataclass
class ExternalAPIConfig:
    """外部API配置"""
    crossref_api_key: Optional[str] = None
    google_scholar_api_key: Optional[str] = None
    serpapi_key: Optional[str] = None
    arxiv_base_url: str = "http://export.arxiv.org/api/query"
    ieee_base_url: str = "https://ieeexploreapi.ieee.org/api/v1"

@dataclass
class InnoCoreConfig:
    """InnoCore AI 主配置类"""
    
    # 基础配置
    app_name: str = "InnoCore AI"
    debug: bool = False
    log_level: str = "INFO"
    
    # LLM配置
    llm: LLMConfig = field(default_factory=LLMConfig)
    
    # 向量数据库配置
    vector_db: VectorDBConfig = field(default_factory=VectorDBConfig)
    
    # 关系数据库配置
    database: DatabaseConfig = field(default_factory=DatabaseConfig)
    
    # Redis配置
    redis: RedisConfig = field(default_factory=RedisConfig)
    
    # 外部API配置
    external_apis: ExternalAPIConfig = field(default_factory=ExternalAPIConfig)
    
    # Agent配置
    agent_max_steps: int = 5
    agent_timeout: int = 300
    concurrent_agents: int = 4
    
    # RAG配置
    retrieval_top_k: int = 5
    similarity_threshold: float = 0.7
    hybrid_search_weights: Dict[str, float] = field(default_factory=lambda: {
        "vector": 0.7,
        "keyword": 0.3
    })
    
    # 性能配置
    cache_ttl: int = 3600  # 缓存过期时间(秒)
    batch_size: int = 10
    max_concurrent_requests: int = 50
    
    def __post_init__(self):
        """初始化后处理"""
        # 从环境变量加载配置
        self.llm.api_key = self.llm.api_key or os.getenv("OPENAI_API_KEY")
        self.llm.base_url = self.llm.base_url or os.getenv("OPENAI_BASE_URL")
        
        # 从环境变量加载模型名称（如果设置了）
        env_model = os.getenv("OPENAI_MODEL") or os.getenv("LLM_MODEL")
        if env_model:
            self.llm.model_name = env_model
        
        self.database.password = self.database.password or os.getenv("DATABASE_PASSWORD")
        self.redis.password = self.redis.password or os.getenv("REDIS_PASSWORD")
        
        self.external_apis.crossref_api_key = self.external_apis.crossref_api_key or os.getenv("CROSSREF_API_KEY")
        self.external_apis.google_scholar_api_key = self.external_apis.google_scholar_api_key or os.getenv("GOOGLE_SCHOLAR_API_KEY")
        self.external_apis.serpapi_key = self.external_apis.serpapi_key or os.getenv("SERPAPI_KEY")
        
        self.debug = os.getenv("DEBUG", "false").lower() == "true"
        self.log_level = os.getenv("LOG_LEVEL", "INFO")

# 全局配置实例
config = InnoCoreConfig()

def get_config() -> InnoCoreConfig:
    """获取全局配置实例"""
    return config

def update_config(**kwargs) -> None:
    """更新配置"""
    global config
    for key, value in kwargs.items():
        if hasattr(config, key):
            setattr(config, key, value)