from typing import Optional

from sqlalchemy import Column, String
from sqlmodel import Field, SQLModel

from app.models.base import _utcnow


class BotSession(SQLModel, table=True):
    __tablename__ = "sessions"

    session_id: str = Field(primary_key=True)
    user_id: Optional[str] = Field(default=None, index=True)
    character_id: Optional[str] = None
    recording_r2_key: Optional[str] = None
    transcription_r2_key: Optional[str] = None
    session_metadata_r2_key: Optional[str] = None
    image_generations_count: int = Field(default=0)
    image_edits_count: int = Field(default=0)
    video_count: int = Field(default=0)
    duration_seconds: Optional[int] = None
    started_at: Optional[int] = None
    ended_at: Optional[int] = None
    status: str = Field(default="completed")
    extra_data: Optional[str] = Field(default=None, sa_column=Column("metadata", String, nullable=True))
    created_at: str = Field(default_factory=_utcnow)
    updated_at: str = Field(default_factory=_utcnow)


class SessionImage(SQLModel, table=True):
    __tablename__ = "session_images"

    id: Optional[int] = Field(default=None, primary_key=True)
    session_id: str = Field(index=True, foreign_key="sessions.session_id")
    user_id: Optional[str] = Field(default=None, index=True)
    image_type: Optional[str] = None
    extra_data: Optional[str] = Field(default=None, sa_column=Column("metadata", String, nullable=True))
    prompt: Optional[str] = None
    created_at: str = Field(default_factory=_utcnow)


class SessionVideo(SQLModel, table=True):
    __tablename__ = "session_videos"

    id: Optional[int] = Field(default=None, primary_key=True)
    session_id: str = Field(index=True, foreign_key="sessions.session_id")
    user_id: Optional[str] = Field(default=None, index=True)
    video_type: Optional[str] = None
    extra_data: Optional[str] = Field(default=None, sa_column=Column("metadata", String, nullable=True))
    prompt: Optional[str] = None
    created_at: str = Field(default_factory=_utcnow)


class SessionPpt(SQLModel, table=True):
    __tablename__ = "session_ppts"

    id: Optional[int] = Field(default=None, primary_key=True)
    session_id: str = Field(index=True, foreign_key="sessions.session_id")
    user_id: Optional[str] = Field(default=None, index=True)
    extra_data: Optional[str] = Field(default=None, sa_column=Column("metadata", String, nullable=True))
    topic: Optional[str] = None
    created_at: str = Field(default_factory=_utcnow)
