# -*- coding: utf-8 -*-

from pydantic import BaseModel
from typing import Any, TypeVar, Type, Generic
from sqlalchemy.orm import DeclarativeBase

ModelType = TypeVar("ModelType", bound=DeclarativeBase)
SchemaType = TypeVar("SchemaType", bound=BaseModel)


class Serialize(Generic[ModelType, SchemaType]):
    """
    序列化工具类，提供模型、Schema 和字典之间的转换功能
    """
    
    @classmethod
    def schema_to_model(cls,schema: Type[SchemaType], model: Type[ModelType]) -> ModelType:
        """
        将 Pydantic Schema 转换为 SQLAlchemy 模型
        
        参数:
        - schema (Type[SchemaType]): Pydantic Schema 实例。
        - model (Type[ModelType]): SQLAlchemy 模型类。
            
        返回:
        - ModelType: SQLAlchemy 模型实例。
            
        异常:
        - ValueError: 转换过程中可能抛出的异常。
        """
        try:
            return model(**cls.model_to_dict(model, schema))
        except Exception as e:
            raise ValueError(f"序列化失败: {str(e)}")

    @classmethod
    def model_to_dict(cls, model: Type[ModelType], schema: Type[SchemaType]) -> dict[str, Any]:
        """
        将 SQLAlchemy 模型转换为 Pydantic Schema
        
        参数:
        - model (Type[ModelType]): SQLAlchemy 模型实例。
        - schema (Type[SchemaType]): Pydantic Schema 类。
            
        返回:
        - dict[str, Any]: 包含模型数据的字典。
            
        异常:
        - ValueError: 转换过程中可能抛出的异常。
        """
        try:
            return schema.model_validate(model).model_dump()
        except Exception as e:
            raise ValueError(f"反序列化失败: {str(e)}")

