# groceries/admin.py
from django.contrib import admin
from django.db import models
from django.utils.translation import gettext_lazy as _

from .models import ItemCategory, Item, ShoppingList, ShoppingListItem


@admin.register(ItemCategory)
class ItemCategoryAdmin(admin.ModelAdmin):
    list_display = ("name", "position")
    list_editable = ("position",)
    search_fields = ("name",)
    ordering = ("position", "name")


@admin.register(Item)
class ItemAdmin(admin.ModelAdmin):
    list_display = ("name", "category", "default_quantity", "created_at", "updated_at")
    list_filter = ("category",)
    search_fields = ("name", "notes")
    readonly_fields = ("created_at", "updated_at")
    ordering = ("name",)


class ShoppingListItemInline(admin.TabularInline):
    model = ShoppingListItem
    extra = 0
    fields = ("position", "item", "quantity", "notes", "checked", "created_at")
    readonly_fields = ("created_at",)
    ordering = ("position", "id")
    raw_id_fields = ("item",)  # rychlejší výběr položek při větším počtu


@admin.register(ShoppingList)
class ShoppingListAdmin(admin.ModelAdmin):
    list_display = (
        "name", "owner", "is_template", "is_completed", "is_archived",
        "due_date", "items_count", "created_at",
    )
    list_filter = ("is_template", "is_completed", "is_archived", "due_date", "owner")
    search_fields = ("name", "notes", "owner__username", "owner__email")
    date_hierarchy = "created_at"
    ordering = ("-created_at",)
    readonly_fields = ("created_at", "updated_at")
    inlines = [ShoppingListItemInline]
    actions = ["mark_completed", "mark_archived", "duplicate_as_template", "duplicate_plain"]

    # přidáme počítadlo položek
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.annotate(_items_count=models.Count("items"))

    def items_count(self, obj):
        return obj._items_count
    items_count.short_description = _("Počet položek")
    items_count.admin_order_field = "_items_count"

    # akce
    def mark_completed(self, request, queryset):
        updated = queryset.update(is_completed=True)
        self.message_user(request, f"Označeno jako hotové: {updated}")
    mark_completed.short_description = "Označit jako dokončené"

    def mark_archived(self, request, queryset):
        updated = queryset.update(is_archived=True)
        self.message_user(request, f"Archivováno: {updated}")
    mark_archived.short_description = "Archivovat"

    def _duplicate(self, sl: ShoppingList, as_template: bool):
        copy = ShoppingList.objects.create(
            owner=sl.owner,
            name=f"{sl.name} (kopie)" if not as_template else f"{sl.name} (šablona)",
            notes=sl.notes,
            due_date=None if as_template else sl.due_date,
            is_completed=False,
            is_archived=False,
            is_template=as_template,
        )
        # zkopíruj položky
        items = [
            ShoppingListItem(
                shopping_list=copy,
                item=li.item,
                quantity=li.quantity,
                notes=li.notes,
                checked=False,
                position=li.position,
            )
            for li in sl.items.all().order_by("position", "id")
        ]
        ShoppingListItem.objects.bulk_create(items)
        return copy

    def duplicate_as_template(self, request, queryset):
        created = 0
        for sl in queryset:
            self._duplicate(sl, as_template=True)
            created += 1
        self.message_user(request, f"Vytvořeno šablon: {created}")
    duplicate_as_template.short_description = "Duplikovat jako šablonu"

    def duplicate_plain(self, request, queryset):
        created = 0
        for sl in queryset:
            self._duplicate(sl, as_template=False)
            created += 1
        self.message_user(request, f"Vytvořeny kopie seznamů: {created}")
    duplicate_plain.short_description = "Duplikovat (běžný seznam)"


# (volitelné) samostatná registrace, kdybys chtěl spravovat položky seznamu mimo inline
@admin.register(ShoppingListItem)
class ShoppingListItemAdmin(admin.ModelAdmin):
    list_display = ("shopping_list", "item", "quantity", "checked", "position", "created_at")
    list_filter = ("checked", "shopping_list__is_template", "shopping_list__owner")
    search_fields = ("shopping_list__name", "item__name", "notes")
    ordering = ("shopping_list", "position", "id")
    raw_id_fields = ("shopping_list", "item")
    readonly_fields = ("created_at",)
