"""
Configuration utility functions

Shared utilities for configuration handling to avoid circular imports.
"""
from uuid import UUID
from sqlalchemy.orm import Session
import uuid as uuid_module


def resolve_config_id(config_id: UUID | int | str, db: Session) -> UUID:
    """
    解析 config_id，支持 UUID、UUID字符串、整数等多种格式

    Args:
        config_id: 配置ID（UUID、UUID字符串 或 整数）
        db: 数据库会话

    Returns:
        UUID: 解析后的配置ID

    Raises:
        ValueError: 当找不到对应的配置时或格式无效时
    """
    from app.models.memory_config_model import MemoryConfig
    
    # 1. 如果已经是 UUID 类型，直接返回
    if isinstance(config_id, UUID):
        return config_id
    
    # 2. 如果是整数类型，通过 config_id_old 查找
    if isinstance(config_id, int):
        if config_id <= 0:
            raise ValueError(f"config_id 必须是正整数: {config_id}")
        
        memory_config = db.query(MemoryConfig).filter(
            MemoryConfig.config_id_old == config_id
        ).first()

        if not memory_config:
            raise ValueError(f"未找到 config_id_old={config_id} 对应的配置")

        return memory_config.config_id
    
    # 3. 如果是字符串类型
    if isinstance(config_id, str):
        config_id_stripped = config_id.strip()
        
        # 3.1 先尝试解析为整数（用于查询 config_id_old）
        # 这样可以处理 "17" 这样的字符串
        try:
            old_id = int(config_id_stripped)
            if old_id > 0:
                memory_config = db.query(MemoryConfig).filter(
                    MemoryConfig.config_id_old == old_id
                ).first()
                if not memory_config:
                    raise ValueError(f"未找到 config_id_old={old_id} 对应的配置")
                return memory_config.config_id
        except ValueError:
            # 不是整数，继续尝试 UUID
            pass
        
        # 3.2 尝试解析为 UUID
        try:
            return uuid_module.UUID(config_id_stripped)
        except ValueError:
            pass
        
        # 3.3 无法解析的字符串格式
        raise ValueError(f"无效的 config_id 格式: '{config_id}'（必须是 UUID 或正整数）")

    # 4. 不支持的类型
    raise ValueError(f"不支持的 config_id 类型: {type(config_id).__name__}")
