from fastapi import HTTPException
from sqlmodel import Session
from app.crud import vote as crud_vote


def upsert_vote(
    session: Session, user_id: int, question_id: int, value: int
) -> dict:
    """Create or update a vote. Returns aggregate score + user's vote."""
    if value not in (1, -1):
        raise HTTPException(status_code=400, detail="Vote value must be 1 or -1")

    if not crud_vote.question_exists(session, question_id):
        raise HTTPException(status_code=404, detail="Question not found")

    crud_vote.upsert_vote(session, user_id, question_id, value)
    score = crud_vote.get_aggregate_score(session, question_id)
    return {"vote_score": score, "user_vote": value}


def remove_vote(
    session: Session, user_id: int, question_id: int
) -> dict:
    """Remove a vote and return updated aggregate score."""
    crud_vote.remove_vote(session, user_id, question_id)
    score = crud_vote.get_aggregate_score(session, question_id)
    return {"vote_score": score, "user_vote": None}
