from fastapi import APIRouter, Depends
from motor.motor_asyncio import AsyncIOMotorDatabase
from app.api import deps
from app.db.session import get_db
from app.models.schemas import User

router = APIRouter()

@router.get("/stats")
async def get_dashboard_stats(
    db: AsyncIOMotorDatabase = Depends(get_db),
    current_user: User = Depends(deps.get_current_user)
):
    game_scores = await db.game_scores.find({"user_id": current_user.id}).to_list(length=100)
    
    total_games = len(set([score["game_name"] for score in game_scores]))
    total_score = sum([score["score"] for score in game_scores])
    avg_score = total_score / len(game_scores) if game_scores else 0
    
    activities_raw = await db.game_scores.find(
        {"user_id": current_user.id}
    ).sort("completed_at", -1).limit(5).to_list(length=5)
    
    # Simple ID stringification
    for a in activities_raw: a["id"] = str(a.get("_id", a.get("id")))
    
    return {
        "user": current_user.dict(),
        "stats": {
            "total_points": current_user.total_points,
            "games_completed": total_games,
            "badges_earned": len(current_user.badges),
            "courses_enrolled": len(current_user.courses_enrolled),
            "average_score": round(avg_score, 2),
            "level_progress": min(100, int((current_user.total_points % 1000) / 10)),
            "current_level": int(current_user.total_points / 1000) + 1
        },
        "recent_activities": activities_raw
    }

@router.get("/community")
async def get_community_stats(
    db: AsyncIOMotorDatabase = Depends(get_db),
    current_user: User = Depends(deps.get_current_user)
):
    total_players = await db.users.count_documents({})
    
    # Pipeline for total games and badges
    games_pipe = [{"$project": {"count": {"$size": {"$ifNull": ["$games_completed", []]}}}}, {"$group": {"_id": None, "total": {"$sum": "$count"}}}]
    badges_pipe = [{"$project": {"count": {"$size": {"$ifNull": ["$badges", []]}}}}, {"$group": {"_id": None, "total": {"$sum": "$count"}}}]
    
    g_res = await db.users.aggregate(games_pipe).to_list(1)
    b_res = await db.users.aggregate(badges_pipe).to_list(1)
    
    rank = await db.users.count_documents({"total_points": {"$gt": current_user.total_points}}) + 1
    
    return {
        "total_players": total_players,
        "total_games_completed": g_res[0]["total"] if g_res else 0,
        "total_badges_earned": b_res[0]["total"] if b_res else 0,
        "user_rank": rank,
        "user_stats": {
            "total_points": current_user.total_points,
            "games_completed_count": len(current_user.games_completed)
        }
    }
