from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from typing import List

from app.db.session import get_db
from app.schemas.social import ServiceProviderCreate, ServiceProviderResponse, VoteCreate, LeaderboardEntry
from app.models.social import ServiceProvider
from app.services.social_service import vote_for_provider, get_leaderboard

# Mivel még nincs teljes Auth rendszerünk a chat kontextusban, 
# egyelőre egy "mock" (szimulált) user függőséget használunk teszteléshez.
# Később ezt lecseréljük a valós `get_current_user`-re.
async def get_mock_current_user():
    # Visszaadjuk a "Good Guy" user ID-ját (2) a teszthez
    return 2

router = APIRouter()

@router.post("/providers", response_model=ServiceProviderResponse, status_code=status.HTTP_201_CREATED)
async def create_provider(
    provider: ServiceProviderCreate,
    db: AsyncSession = Depends(get_db),
    user_id: int = Depends(get_mock_current_user)
):
    new_provider = ServiceProvider(**provider.model_dump(), added_by_user_id=user_id)
    db.add(new_provider)
    await db.commit()
    await db.refresh(new_provider)
    return new_provider

@router.get("/providers", response_model=List[ServiceProviderResponse])
async def read_providers(skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db)):
    from sqlalchemy import select
    result = await db.execute(select(ServiceProvider).offset(skip).limit(limit))
    return result.scalars().all()

# --- ÚJ VÉGPONTOK (A Prompt alapján) ---

@router.post("/providers/{provider_id}/vote")
async def vote(
    provider_id: int,
    vote_data: VoteCreate,
    db: AsyncSession = Depends(get_db),
    user_id: int = Depends(get_mock_current_user)
):
    """Szavazás egy szolgáltatóra. A rendszer automatikusan kezeli a hírnevet és pontokat."""
    if vote_data.vote_value not in [1, -1]:
        raise HTTPException(status_code=400, detail="Vote value must be 1 or -1")

    result = await vote_for_provider(db, user_id, provider_id, vote_data.vote_value)
    
    if "error" in result:
        raise HTTPException(status_code=400, detail=result["error"])
        
    return result

@router.get("/competitions/{competition_id}/leaderboard", response_model=List[LeaderboardEntry])
async def get_competition_leaderboard(competition_id: int, db: AsyncSession = Depends(get_db)):
    """Ranglista lekérése az adott versenyhez."""
    results = await get_leaderboard(db, competition_id)
    
    leaderboard_data = []
    for rank, (score, full_name) in enumerate(results, start=1):
        # A service UserScore objektumot és nevet ad vissza, ezt alakítjuk át
        leaderboard_data.append(
            LeaderboardEntry(
                username=full_name or "Anonymous",
                points=score.points,
                rank=rank
            )
        )
    return leaderboard_data