from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
import datetime

class Person(models.Model):
    """Repräsentiert Schüler oder Lehrer."""
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    rolle = models.CharField(max_length=20, choices=[('schueler', 'Schüler'), ('lehrer', 'Lehrer'), ('mitarbeiter','Mensa-Mitarbeiter'), ('chef','Mensa-Leitung')])
    klasse = models.CharField(max_length=4, blank=True, null=True) # Nur für Schüler relevant

    class Meta:
        verbose_name_plural = "Personen"

    def __str__(self):
        return f"{self.user.username} ({self.rolle})"

class SpeiseplanTag(models.Model):
    """Ein bestimmter Tag im Speiseplan."""
    datum = models.DateField(unique=True)

    class Meta:
        verbose_name = "Tag mit Speiseplan"
        verbose_name_plural = "Tage mit Speiseplan"

    def __str__(self):
        return self.datum.strftime('%d.%m.%Y')

class Kategorie(models.Model):
    """
    Definiert die Art der Speise (Süßspeise, Hauptgericht, etc.).
    """
    name = models.CharField(max_length=50, unique=True, default="")

    class Meta:
        verbose_name = "Kategorie"
        verbose_name_plural = "Kategorien"

    def __str__(self):
        return self.name

class Gericht(models.Model):
    """Ein einzelnes Gericht (z.B. 'Nudeln mit Tomatensauce')."""
    name = models.CharField(max_length=100)
    # PROTECT verhindert, dass eine Kategorie gelöscht wird,
    # solange noch Gerichte ihr zugeordnet sind.
    kategorie = models.ForeignKey(
        Kategorie,
        on_delete=models.PROTECT,
        related_name='gerichte'
    )
    ist_vegetarisch = models.BooleanField(default=False)
    ist_allergene_frei = models.BooleanField(default=False)
    allergene = models.TextField(blank=True, default="")
    preis = models.DecimalField(max_digits=5, decimal_places=2, default=0.00)

    now = datetime.datetime.now()

    time_last_change = models.TimeField(default=now)
    time_creation = models.TimeField(default=now)

    # Das Attribut für das "Dauerangebot"
    ist_dauerangebot = models.BooleanField(
        default=False,
        help_text="Wenn aktiviert, ist dieses Gericht immer verfügbar und nicht an einen spezifischen Tag gebunden."
    )

    def __str__(self):
        return f"{self.name} ({self.kategorie.name})"

    class Meta:
        verbose_name = "Gericht"
        verbose_name_plural = "Gerichte"
        permissions = [("can_create_Gericht", "Kann neues Gericht anlegen")]
        ordering = ["kategorie", "name", "preis"]
        get_latest_by = "time_last_change"

class Menue(models.Model):
    """Eine Kombination von Speisen für einen Tag (z.B. Hauptgang + Dessert)."""
    tag = models.ForeignKey(SpeiseplanTag, on_delete=models.CASCADE, related_name='menues')
    gericht = models.ForeignKey(Gericht, on_delete=models.CASCADE)
    preis = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return f"{self.tag.datum}: {self.gericht.name} ({self.preis}€)"

    class Meta:
        verbose_name = "Menü"
        verbose_name_plural = "Menüs"

class Bestellung(models.Model):
    """Eine abgeschlossene Bestellung eines Nutzers."""
    STATUS_CHOICES = [
        ('offen', 'Offen'),
        ('abgeholt', 'Abgeholt'),
        ('verwaist', 'Nicht abgeholt'),
        ('bezahlt', 'Bezahlt'),
        ('storniert', 'Storniert'),
    ]

    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    menue = models.ForeignKey(Menue, on_delete=models.CASCADE)
    datum_bestellung = models.DateTimeField(default=timezone.now)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='offen')
    bezahlt = models.BooleanField(default=False)

    def __str__(self):
        return f"Bestellung {self.id} von {self.person.user.username}"

    class Meta:
        verbose_name = "Bestellung"
        verbose_name_plural = "Bestellungen"

