from django.contrib import admin
from simple_history.admin import SimpleHistoryAdmin

from .models import Product, Tag, Location, LocationType
from .views import bulk_add_tags, import_from_sightings


@admin.register(LocationType)
class LocationTypeAdmin(SimpleHistoryAdmin):
    list_display = ["name", "description", "location_count", "created_at"]
    search_fields = ["name", "description"]
    ordering = ["name"]

    def location_count(self, obj):
        return obj.locations.count()

    location_count.short_description = "Locations Using This"


@admin.register(Product)
class ProductAdmin(SimpleHistoryAdmin):
    list_display = ["name", "part_number", "location", "min_stock_level", "tags_count", "created_at"]
    search_fields = ["name", "part_number", "description", "location__code"]
    list_filter = ["location"]
    filter_horizontal = ["tags"]

    def tags_count(self, obj):
        return obj.tags.count()

    tags_count.short_description = "Tags"


@admin.register(Tag)
class TagAdmin(SimpleHistoryAdmin):
    list_display = ["tag_id", "note", "created_at"]
    search_fields = ["tag_id"]
    change_list_template = "admin/products/tag/change_list.html"

    def get_urls(self):
        from django.urls import path

        urls = super().get_urls()
        custom = [
            path(
                "bulk-add/",
                self.admin_site.admin_view(bulk_add_tags),
                name="products_tag_bulk_add",
            ),
            path(
                "import-from-sightings/",
                self.admin_site.admin_view(import_from_sightings),
                name="products_tag_import_sightings",
            ),
        ]
        return custom + urls


@admin.register(Location)
class LocationAdmin(SimpleHistoryAdmin):
    list_display = ["code", "name", "parent_display", "type_display", "created_at"]
    search_fields = ["code", "name", "description", "type__name"]
    list_filter = ["parent", "type"]
    ordering = ["code"]

    def parent_display(self, obj):
        return obj.parent.code if obj.parent else "(root)"

    parent_display.short_description = "Parent"

    def type_display(self, obj):
        return obj.type.name if obj.type else "(none)"

    type_display.short_description = "Type"
