from typing import Literal, Optional

from pydantic import BaseModel
from sqlalchemy import Column, ForeignKey
from sqlmodel import Field, Relationship, SQLModel

from ..config import config_manager


class Chatroom(SQLModel, table=True):
    """
    聊天室 表结构。
    聊天室是供剧本演出的场所。在聊天室中，由用户选定剧本模板、决定剧本走向，AI 按照剧本进行演出。
    我们规定 script 是故事脚本设定，content 是故事正片，script template 是脚本模板。

    规定 creator_id 为 0 的聊天室为公共聊天室，其权限由配置文件决定。
    """

    id: int | None = Field(default=None, primary_key=True)
    name: str
    description: str
    feature_image: str = Field(
        default=f"{config_manager.get('site_url', 'http://localhost:9000')}/nyahome/normal-thumbnail.png"
    )
    content: str
    script: str

    script_template_id: int | None = Field(
        default=None, sa_column=Column(ForeignKey("scripttemplate.id", name="fk_chatroom_script_template"))
    )
    script_template_version: str | None
    script_template: "ScriptTemplate" = Relationship()

    creator_id: int = Field(sa_column=Column(ForeignKey("modeluser.id", name="fk_chatroom_creator")))
    creator: Optional["ModelUser"] = Relationship(back_populates="chatrooms")


class ChatroomPublic(BaseModel):
    id: int | None = None
    name: str
    description: str
    feature_image: str

    script_template_id: int | None = None
    script_template_version: str | None


class ScriptTemplate(SQLModel, table=True):
    """
    剧本模板 表结构。
    聊天室通过加载剧本模板来开始演绎一个剧本。
    【开发中】
    """

    id: int | None = Field(default=None, primary_key=True)
    name: str
    description: str
    version: str
    origin_url: str
    script: str


class ScriptWordBook(BaseModel):
    key_word: str
    message: str


class ChatScript(BaseModel):
    """
    剧本（提示词与世界书）。
    """

    main_prompt: str
    user_prefix: str
    user_suffix: str
    world_books: list[ScriptWordBook]


class ChatroomChat(BaseModel):
    """
    聊天室的 chat 端点接收的数据结构，作为用户输入。
    """

    message: str
    prefix: str
    mode: Literal["continue", "expand"]
    model_id: int


class ChatroomChatAccept(BaseModel):
    user_message: str
    aii_message: str
    mode: Literal["continue", "expand"]


class ChatroomChatEdit(BaseModel):
    old_message: str
    new_message: str
    change: Literal["user", "aii"]


class ChatroomChatDelete(BaseModel):
    message: str
    change: Literal["user", "aii"]


from .model_user import ModelUser  # noqa: E402
