from fastapi import APIRouter, HTTPException, Depends from pydantic import BaseModel from typing import Optional import structlog from auth import get_db, get_current_user logger = structlog.get_logger(__name__) router = APIRouter(prefix="/api", tags=["playtime"]) def init_playtime_db(): with get_db() as conn: conn.executescript(""" CREATE TABLE IF NOT EXISTS playtime ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, pack_name TEXT DEFAULT '', minutes INTEGER DEFAULT 0, last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ); CREATE INDEX IF NOT EXISTS idx_playtime_user ON playtime(user_id); """) class SyncPlaytimeRequest(BaseModel): minutes: int pack_name: Optional[str] = "" @router.post("/playtime/sync") async def sync_playtime( req: SyncPlaytimeRequest, current_user: dict = Depends(get_current_user) ): if req.minutes < 0 or req.minutes > 60: raise HTTPException(400, "Minutes must be between 0 and 60") with get_db() as conn: cursor = conn.execute( "SELECT id, minutes FROM playtime WHERE user_id = ? AND pack_name = ?", (current_user["id"], req.pack_name) ) existing = cursor.fetchone() if existing: conn.execute( "UPDATE playtime SET minutes = minutes + ?, last_updated = CURRENT_TIMESTAMP WHERE id = ?", (req.minutes, existing[0]) ) else: conn.execute( "INSERT INTO playtime (user_id, pack_name, minutes) VALUES (?, ?, ?)", (current_user["user_id"], req.pack_name, req.minutes) ) logger.info("Playtime synced", user=current_user["user_id"], minutes=req.minutes) return {"status": "ok"} @router.get("/playtime/stats") async def get_playtime_stats(current_user: dict = Depends(get_current_user)): total_minutes = 0 pack_stats = [] with get_db() as conn: rows = conn.execute( "SELECT COALESCE(SUM(minutes), 0) FROM playtime WHERE user_id = ?", (current_user["user_id"],) ) total_minutes = rows.fetchone()[0] rows = conn.execute( "SELECT pack_name, minutes FROM playtime WHERE user_id = ? AND pack_name != '' ORDER BY minutes DESC", (current_user["user_id"],) ) for row in rows: pack_stats.append({ "pack_name": row[0], "minutes": row[1] }) return { "total_minutes": total_minutes, "total_hours": round(total_minutes / 60, 1), "packs": pack_stats }