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

from app.database import get_db
from app.models.user import User
from app.models.favorite import Favorite
from app.models.question import Question
from app.schemas.favorite import FavoriteCreate, FavoriteResponse
from app.utils.auth import get_current_user

router = APIRouter()


@router.post("", response_model=FavoriteResponse, status_code=201)
def add_favorite(
    data: FavoriteCreate,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
):
    """Add a question to user's favorites."""
    # Check if question exists
    question = db.query(Question).filter(Question.id == data.question_id).first()
    if not question:
        raise HTTPException(status_code=404, detail="Question not found")

    # Check if already favorited
    existing = db.query(Favorite).filter(
        Favorite.user_id == current_user.id,
        Favorite.question_id == data.question_id
    ).first()
    if existing:
        return existing  # Already favorited, return existing

    # Create new favorite
    favorite = Favorite(
        user_id=current_user.id,
        question_id=data.question_id
    )
    db.add(favorite)
    db.commit()
    db.refresh(favorite)
    return favorite


@router.delete("/{question_id}", status_code=204)
def remove_favorite(
    question_id: int,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
):
    """Remove a question from user's favorites."""
    favorite = db.query(Favorite).filter(
        Favorite.user_id == current_user.id,
        Favorite.question_id == question_id
    ).first()
    if not favorite:
        raise HTTPException(status_code=404, detail="Favorite not found")

    db.delete(favorite)
    db.commit()
    return None


@router.get("", response_model=list[int])
def list_favorites(
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
):
    """Get list of favorited question IDs for current user."""
    favorites = db.query(Favorite.question_id).filter(
        Favorite.user_id == current_user.id
    ).all()
    return [f[0] for f in favorites]
