from django.db import models
from decimal import Decimal
from webapp.models import Invoice  # Явно импортируем модель Invoice из приложения webapp

class Lottery(models.Model):
    name = models.CharField("Название лотереи", max_length=255)
    description = models.TextField("Описание", blank=True)
    created_at = models.DateTimeField("Дата создания", auto_now_add=True)
    finished = models.BooleanField(default=False, verbose_name="Завершена")
    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "Лотерея"
        verbose_name_plural = "Лотереи"


class Prize(models.Model):
    lottery = models.ForeignKey(
        Lottery, 
        on_delete=models.CASCADE, 
        related_name="prizes", 
        verbose_name="Лотерея"
    )
    prize_place = models.CharField(
        "Призовое место", 
        max_length=50, 
        help_text="Например, 1 место, 2 место и т.д."
    )
    description = models.TextField("Описание приза", blank=True)
    reward = models.DecimalField(
        "Награда", 
        max_digits=10, 
        decimal_places=2, 
        default=Decimal("0.00")
    )
    # Победитель назначается администратором из списка участников лотереи (LotteryParticipant)
    winner = models.ForeignKey(
        "draw.LotteryParticipant", 
        on_delete=models.SET_NULL, 
        null=True, 
        blank=True,
        verbose_name="Победитель (счет)",
        help_text="Выберите счет участника лотереи, который выиграл приз"
    )

    def __str__(self):
        return f"{self.prize_place} - {self.lottery.name}"

    class Meta:
        verbose_name = "Приз"
        verbose_name_plural = "Призы"


class LotteryParticipant(models.Model):
    lottery = models.ForeignKey(
        Lottery,
        on_delete=models.CASCADE,
        related_name="participants",
        verbose_name="Лотерея"
    )
    # Ссылка на счет-участник из приложения webapp (модель Invoice)
    invoice = models.ForeignKey(
        Invoice,
        on_delete=models.CASCADE,
        verbose_name="Счет участника"
    )
    added_at = models.DateTimeField("Дата добавления", auto_now_add=True)
    used = models.BooleanField("Использован", default=False,
                               help_text="Отметка, что этот счет уже участвовал в розыгрыше")
    
    class Meta:
        unique_together = ("lottery", "invoice")
        verbose_name = "Участник лотереи"
        verbose_name_plural = "Участники лотереи"

    def __str__(self):
        return f"{self.invoice} в {self.lottery.name}"


class DrawResult(models.Model):
    """
    Результат розыгрыша для конкретного приза.
    Каждому призу соответствует один активный результат розыгрыша.
    """
    lottery = models.ForeignKey(
        Lottery,
        on_delete=models.CASCADE,
        related_name="draw_results",
        verbose_name="Лотерея"
    )
    prize = models.OneToOneField(
        Prize,
        on_delete=models.CASCADE,
        verbose_name="Приз"
    )
    # Ссылка на участника (LotteryParticipant), выбранного в розыгрыше
    participant = models.ForeignKey(
        LotteryParticipant,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name="Победитель"
    )
    confirmed = models.BooleanField("Подтвержден", default=False)
    drawn_at = models.DateTimeField("Время розыгрыша", auto_now_add=True)

    def __str__(self):
        return f"Результат для {self.prize} — {self.participant}"

    class Meta:
        verbose_name = "Результат розыгрыша"
        verbose_name_plural = "Результаты розыгрыша"
