from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session

from app.api.deps import User, get_current_user
from app.core.database import get_db
from app.schemas import (
    ContributionResponse,
    ExpertProfileCreate,
    ExpertProfileResponse,
    ExpertProfileUpdate,
)
from app.services.expert_profile_manager import get_expert_profile_manager

from common_logging import get_logger

logger = get_logger(__name__)

router = APIRouter()

@router.post('/', response_model=ExpertProfileResponse)
async def create_profile(profile: ExpertProfileCreate, db: Session=Depends(get_db), current_user: User=Depends(get_current_user)):
    manager = get_expert_profile_manager(db)
    result = manager.create_profile(user_id=profile.user_id, expertise_areas=profile.expertise_areas, skills=profile.skills, bio=profile.bio, metadata=profile.metadata)
    logger.bind(expert_id=result["id"]).info("Expert profile created")
    return result

@router.get('/', response_model=list[ExpertProfileResponse])
async def list_profiles(expertise_area: str | None=Query(None), min_quality_score: float=Query(0.0), db: Session=Depends(get_db)):
    manager = get_expert_profile_manager(db)
    if expertise_area:
        return manager.find_experts_by_expertise(expertise_area, min_quality_score)
    from app.models import ExpertProfile
    profiles = db.query(ExpertProfile).all()
    return [manager._profile_to_dict(p) for p in profiles]

@router.get('/leaderboard', response_model=list[ExpertProfileResponse])
async def get_leaderboard(metric: str=Query('reputation_score'), limit: int=Query(10), db: Session=Depends(get_db)):
    manager = get_expert_profile_manager(db)
    return manager.get_leaderboard(metric, limit)

@router.get('/{user_id}', response_model=ExpertProfileResponse)
async def get_profile(user_id: int, db: Session=Depends(get_db)):
    manager = get_expert_profile_manager(db)
    try:
        return manager.get_profile(user_id)
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e)) from None

@router.put('/{user_id}', response_model=ExpertProfileResponse)
async def update_profile(user_id: int, update: ExpertProfileUpdate, db: Session=Depends(get_db), current_user: User=Depends(get_current_user)):
    manager = get_expert_profile_manager(db)
    try:
        result = manager.update_profile(user_id=user_id, expertise_areas=update.expertise_areas, skills=update.skills, bio=update.bio)
        logger.bind(expert_id=user_id).info("Expert profile updated")
        return result
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e)) from None

@router.get('/{user_id}/contributions', response_model=list[ContributionResponse])
async def get_contributions(user_id: int, contribution_type: str | None=Query(None), db: Session=Depends(get_db)):
    manager = get_expert_profile_manager(db)
    return manager.get_contributions(user_id, contribution_type)
