from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()

class ItemCategory(models.Model):
    name = models.CharField("Název kategorie", max_length=80, unique=True)
    position = models.PositiveIntegerField("Pořadí", default=0)

    class Meta:
        ordering = ["position", "name"]
        verbose_name = "Kategorie položky"
        verbose_name_plural = "Kategorie položek"

    def __str__(self):
        return self.name

class Item(models.Model):
    """
    Definice položky (globální katalog, např. 'Mléko 1,5 %', 'Banány').
    """
    name = models.CharField("Název", max_length=120, unique=True)
    default_quantity = models.DecimalField(
        "Množství", max_digits=10, decimal_places=3, null=True, blank=True
    )
    category = models.ForeignKey(
        ItemCategory, null=True, blank=True, on_delete=models.SET_NULL, verbose_name="Kategorie"
    )
    notes = models.CharField("Poznámka", max_length=200, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["name"]
        verbose_name = "Položka (definice)"
        verbose_name_plural = "Položky (definice)"

    def __str__(self):
        return self.name

class ShoppingList(models.Model):
    """
    Nákupní seznam (např. 'Víkend', 'Týdenní nákup').
    """
    owner = models.ForeignKey(
        User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name="Vlastník"
    )
    name = models.CharField("Název seznamu", max_length=120)
    notes = models.TextField("Poznámka", blank=True)
    due_date = models.DateField("Do kdy nakoupit", null=True, blank=True)
    is_completed = models.BooleanField("Hotovo", default=False)
    is_archived = models.BooleanField("Archivováno", default=False)
    is_template = models.BooleanField("Šablona", default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["-created_at"]
        verbose_name = "Nákupní seznam"
        verbose_name_plural = "Nákupní seznamy"

    def __str__(self):
        return self.name

    @property
    def item_count(self):
        return self.items.all().count()


class ShoppingListItem(models.Model):
    """
    Položka v konkrétním nákupním seznamu.
    Odkazuje na definici Item, ale umožňuje overrides (množství, jednotku, text).
    """
    UNIT_CHOICES = [
        ('', 'Bez jednotky'),
        ('ks', 'ks'),
        ('g', 'g'),
        ('kg', 'kg'),
        ('ml', 'ml'),
        ('l', 'l'),
        ('dl', 'dl'),
        ('cm', 'cm'),
        ('m', 'm'),
        ('bal', 'bal'),
        ('sáček', 'sáček'),
        ('plechovka', 'plechovka'),
        ('láhev', 'láhev'),
        ('krabice', 'krabice'),
        ('pásek', 'pásek'),
        ('kus', 'kus'),
    ]
    
    shopping_list = models.ForeignKey(
        ShoppingList, on_delete=models.CASCADE, related_name="items", verbose_name="Seznam"
    )
    item = models.ForeignKey(
        Item, on_delete=models.PROTECT, related_name="list_items", verbose_name="Položka"
    )


    quantity = models.DecimalField(
        "Množství", max_digits=10, decimal_places=3, null=True, blank=True
    )
    unit = models.CharField(
        "Jednotka", max_length=20, choices=UNIT_CHOICES, blank=True, default=''
    )
    notes = models.CharField("Poznámka", max_length=200, blank=True)

    checked = models.BooleanField("Zaškrtnuto (koupeno)", default=False)
    position = models.PositiveIntegerField("Pořadí", default=0)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["position", "id"]
        verbose_name = "Položka v seznamu"
        verbose_name_plural = "Položky v seznamu"

    def __str__(self):
        return self.item.name