from django.db import transaction, IntegrityError
from .models import Vote
from nominations.models import Candidat

class VoteError(Exception): pass

@transaction.atomic
def cast_vote(voter_hash: str, candidat_id: str) -> Vote:
    try:
        candidat = Candidat.objects.select_related('categorie', 'categorie__evenement').get(id=candidat_id)
        return Vote.objects.create(
            voter_hash=voter_hash,
            evenement=candidat.categorie.evenement,
            categorie=candidat.categorie,
            candidat=candidat
        )
    except IntegrityError:
        raise VoteError("Vous avez déjà voté dans cette catégorie.")
    except Candidat.DoesNotExist:
        raise VoteError("Candidat introuvable.")