import datetime

from sqlmodel import JSON, Column, Field, SQLModel


class ProductEventBase(SQLModel):
    user_id: int
    event_name: str
    payload: dict | None | None = Field(default_factory=dict, sa_column=Column(JSON))


class ProductEventCreate(ProductEventBase):
    event_name: str
    event_origin: str
    event_type: str
    payload: dict | None | None | None = Field(default_factory=dict, sa_column=Column(JSON))
    user_id: int


class ProductEvent(ProductEventBase, table=True):
    created_at: datetime.datetime = Field(default_factory=datetime.datetime.utcnow,)
    event_name: str
    event_origin: str
    event_type: str
    id: int | None = Field(default=None, primary_key=True)
    payload: dict | None = Field(default_factory=dict, sa_column=Column(JSON))
    public_id: str
    updated_at: datetime.datetime = Field(default_factory=datetime.datetime.utcnow,)
    user_id: int

class ProductEventPublic(ProductEventBase):
    event_name: str
    payload: dict | None = Field(default_factory=dict, sa_column=Column(JSON))
    public_id: str
    user_id: int
    created_at: datetime.datetime = Field(
        default_factory=datetime.datetime.utcnow,
    )
    updated_at: datetime.datetime = Field(
        default_factory=datetime.datetime.utcnow,
    )


class ProductEventsPublic(SQLModel):
    data: list[ProductEventPublic]
    count: int


class UserClipListenRecordBase(SQLModel):
    clip_id: str
    user_id: int


class UserClipListenRecordCreate(UserClipListenRecordBase):
    clip_id: str
    user_id: int
    clip_data: dict | None = Field(default_factory=dict, sa_column=Column(JSON))


class UserClipListenRecord(UserClipListenRecordBase, table=True):
    id: int | None = Field(default=None, primary_key=True)
    public_id: str
    clip_id: str
    user_id: int
    created_at: datetime.datetime = Field(default_factory=datetime.datetime.utcnow,)
    updated_at: datetime.datetime = Field(default_factory=datetime.datetime.utcnow,)
    clip_dislike_count: int | None
    clip_flag_count: int | None
    clip_model_name: str | None
    clip_play_count: int | None
    clip_skip_count: int | None
    clip_upvote_count: int | None

class UserClipListenRecordPublic(UserClipListenRecordBase):
    public_id: str
    clip_id: str
    created_at: datetime.datetime = Field(
        default_factory=datetime.datetime.utcnow,
    )
    updated_at: datetime.datetime = Field(
        default_factory=datetime.datetime.utcnow,
    )

class UserClipListenRecordsPublic(SQLModel):
    clip_listen_records: list[UserClipListenRecordPublic]
    count: int
    offset: int
    limit: int
