from typing import Type

from sqlalchemy.orm import Session

from gptdb.core.interface.prompt import PromptTemplateIdentifier, StoragePromptTemplate
from gptdb.core.interface.storage import StorageItemAdapter

from .models import ServeEntity


class PromptTemplateAdapter(StorageItemAdapter[StoragePromptTemplate, ServeEntity]):
    def to_storage_format(self, item: StoragePromptTemplate) -> ServeEntity:
        return ServeEntity(
            chat_scene=item.chat_scene,
            sub_chat_scene=item.sub_chat_scene,
            prompt_type=item.prompt_type,
            prompt_name=item.prompt_name,
            content=item.content,
            input_variables=item.input_variables,
            model=item.model,
            prompt_language=item.prompt_language,
            prompt_format=item.prompt_format,
            user_name=item.user_name,
            sys_code=item.sys_code,
        )

    def from_storage_format(self, model: ServeEntity) -> StoragePromptTemplate:
        return StoragePromptTemplate(
            chat_scene=model.chat_scene,
            sub_chat_scene=model.sub_chat_scene,
            prompt_type=model.prompt_type,
            prompt_name=model.prompt_name,
            content=model.content,
            input_variables=model.input_variables,
            model=model.model,
            prompt_language=model.prompt_language,
            prompt_format=model.prompt_format,
            user_name=model.user_name,
            sys_code=model.sys_code,
        )

    def get_query_for_identifier(
        self,
        storage_format: Type[ServeEntity],
        resource_id: PromptTemplateIdentifier,
        **kwargs,
    ):
        session: Session = kwargs.get("session")
        if session is None:
            raise Exception("session is None")
        query_obj = session.query(ServeEntity)
        for key, value in resource_id.to_dict().items():
            if value is None:
                continue
            query_obj = query_obj.filter(getattr(ServeEntity, key) == value)
        return query_obj
