import uuid
from typing import Any

from fastapi import APIRouter, Query
from fastapi.responses import JSONResponse
from sqlalchemy import func
from sqlmodel import select

from app.api.deps import SessionDep
from app.models import (
    UserClipListenRecord,
    UserClipListenRecordCreate,
    UserClipListenRecordsPublic,
)

router = APIRouter()


@router.post("/clip_listen_records")
def create_user_clip_listen_record(*, session: SessionDep, play_history_record_in: UserClipListenRecordCreate) -> Any:
    """Add clip to users play history."""
    raw_data = play_history_record_in.model_dump()
    user_clip_listen_record_data = {
        "public_id": f"evt-{uuid.uuid4()}",
        "clip_id": raw_data["clip_id"],
        "user_id": raw_data["user_id"],
        "clip_dislike_count": raw_data["clip_data"].get("dislike_count"),
        "clip_flag_count": raw_data["clip_data"].get("flag_count"),
        "clip_play_count": raw_data["clip_data"].get("play_count"),
        "clip_skip_count": raw_data["clip_data"].get("skip_count"),
        "clip_upvote_count": raw_data["clip_data"].get("upvote_count"),
        "clip_model_name": raw_data["clip_data"].get("model_name"),
    }
    db_obj = UserClipListenRecord.model_validate(user_clip_listen_record_data)

    session.add(db_obj)
    session.commit()
    session.refresh(db_obj)

    return JSONResponse(content={"status": "ok"})



@router.get("/clip_listen_records/{user_id}", response_model=UserClipListenRecordsPublic)
def get_user_clip_listen_records(*, session: SessionDep, user_id: int, offset: int = 0, limit: int = Query(default=100, le=100)) -> Any:
    """Get user's clip listen records."""
    clip_listen_records = session.exec(
        select(UserClipListenRecord)
        .where(UserClipListenRecord.user_id == user_id)
        .order_by(UserClipListenRecord.created_at.desc())
        .offset(offset)
        .limit(limit)
    ).all()

    clip_listen_records_count = session.exec(
        select(func.count(UserClipListenRecord.id))
        .where(
            UserClipListenRecord.user_id == user_id
        )
    ).one()

    return {
        "clip_listen_records": clip_listen_records,
        "count": clip_listen_records_count,
        "offset": offset,
        "limit": limit
    }
