from pydantic import BaseModel, Field
from typing import Optional, Literal, List
from app.schemas.auth import UserOut

# LLM Provider 类型
LLMProviderType = Literal["openai", "claude", "ollama", "deepseek", "custom"]
LLMType = Literal["chat", "vlm", "embedding", "rerank"]


# 单个模型配置
class LLMModelConfig(BaseModel):
    name: str = ""  # 模型名称/别名，用于标识
    provider: LLMProviderType = "openai"
    model: str = ""
    base_url: str = ""
    api_key: str = ""
    enabled: bool = True  # 是否启用


# LLM 配置输入 - 每种类型支持多个模型
class LLMConfigIn(BaseModel):
    chat: Optional[List[LLMModelConfig]] = []
    vlm: Optional[List[LLMModelConfig]] = []
    embedding: Optional[List[LLMModelConfig]] = []
    rerank: Optional[List[LLMModelConfig]] = []


# 定时任务配置
class SchedulerConfigIn(BaseModel):
    daily_plan_time: Optional[str] = "08:00"
    forum_scan_interval_minutes: Optional[int] = 30
    todo_ai_generate_time: Optional[str] = "08:00"
    enabled: Optional[bool] = True


# 用户资料更新
class ProfileUpdateIn(BaseModel):
    full_name: Optional[str] = Field(None, min_length=2, max_length=50)
    password: Optional[str] = Field(None, min_length=8)
    current_password: Optional[str] = None


# 完整设置输出
class SettingsOut(BaseModel):
    profile: UserOut
    llm_config: Optional[dict] = None
    scheduler_config: Optional[dict] = None

    model_config = {"from_attributes": True}


# 测试 LLM 连接请求
class LLMTestIn(BaseModel):
    type: LLMType
    provider: LLMProviderType
    model: str
    base_url: str
    api_key: str
