from django.contrib.auth import get_user_model
from django.db import models
from django.utils.translation import gettext_lazy as _

User = get_user_model()


class Election(models.Model):
    name = models.CharField(_("nom"), max_length=255)
    short_name = models.SlugField(_("nom bref"), unique=True)
    description = models.TextField(_("description"), blank=True)

    start_date = models.DateTimeField(_("date et heure de début"))
    end_date = models.DateTimeField(_("date et heure de fin"))

    created_by = models.ForeignKey(
        User, on_delete=models.SET_NULL, blank=True, null=True
    )

    results_public = models.BooleanField(_("résultats publics"), default=False)
    tallied = models.BooleanField(_("dépouillée"), default=False)
    # TODO : cache tally or recompute it each time ?

    archived = models.BooleanField(_("archivée"), default=False)

    class Meta:
        ordering = ["-start_date", "-end_date"]


class Question(models.Model):
    election = models.ForeignKey(
        Election, related_name="questions", on_delete=models.CASCADE
    )
    text = models.TextField(_("question"), blank=False)
    # We cache the maximum number of votes for an option
    max_votes = models.PositiveSmallIntegerField(
        _("nombre maximal de votes reçus"), default=0
    )

    class Meta:
        ordering = ["id"]


class Option(models.Model):
    question = models.ForeignKey(
        Question, related_name="options", on_delete=models.CASCADE
    )
    text = models.TextField(_("texte"), blank=False)
    voters = models.ManyToManyField(
        User,
        related_name="votes",
    )
    # For now, we store the amount of votes received after the election is tallied
    nb_votes = models.PositiveSmallIntegerField(_("nombre de votes reçus"), default=0)

    class Meta:
        ordering = ["id"]
