from django.contrib import admin, messages
from django.core.exceptions import ValidationError

from . import services

from .models import Company, Department, Region, ServiceCenter


class OrganizationAdmin(admin.ModelAdmin):
    ordering = ("code",)
    readonly_fields = ("id", "created_at", "updated_at")
    search_fields = ("code", "name")
    list_filter = ("is_active",)
    actions = ("deactivate_selected", "reactivate_selected")

    def get_readonly_fields(self, request, obj=None):
        fields = super().get_readonly_fields(request, obj)
        return (*fields, "company") if obj is not None and not isinstance(obj, Company) else fields

    def _lifecycle_action(self, request, queryset, *, active):
        operations = {
            Company: (services.deactivate_company, services.reactivate_company, "company"),
            Region: (services.deactivate_region, services.reactivate_region, "region"),
            Department: (services.deactivate_department, services.reactivate_department, "department"),
            ServiceCenter: (services.deactivate_service_center, services.reactivate_service_center, "service_center"),
        }
        deactivate, reactivate, argument = operations[self.model]
        operation = reactivate if active else deactivate
        completed = 0
        for obj in queryset.order_by("pk"):
            try:
                operation(**{argument: obj})
            except ValidationError as error:
                self.message_user(request, f"{obj}: {'; '.join(error.messages)}", level=messages.ERROR)
            else:
                completed += 1
        self.message_user(request, f"Lifecycle operation completed for {completed} record(s).")

    @admin.action(description="Deactivate selected records (includes descendants)", permissions=["change"])
    def deactivate_selected(self, request, queryset):
        self._lifecycle_action(request, queryset, active=False)

    @admin.action(description="Reactivate selected records only", permissions=["change"])
    def reactivate_selected(self, request, queryset):
        self._lifecycle_action(request, queryset, active=True)


@admin.register(Company)
class CompanyAdmin(OrganizationAdmin):
    list_display = ("code", "name", "legal_name", "is_active")
    search_fields = ("code", "name", "legal_name")


@admin.register(Region)
class RegionAdmin(OrganizationAdmin):
    list_display = ("code", "name", "company", "is_active")
    list_filter = ("company", "is_active")
    list_select_related = ("company",)
    search_fields = ("code", "name", "company__code", "company__name")
    autocomplete_fields = ("company",)


@admin.register(ServiceCenter)
class ServiceCenterAdmin(OrganizationAdmin):
    list_display = ("code", "name", "company", "region", "center_type", "is_active")
    list_filter = ("company", "region", "center_type", "is_active")
    list_select_related = ("company", "region")
    search_fields = ("code", "name", "company__code", "region__code")
    autocomplete_fields = ("company", "region")


@admin.register(Department)
class DepartmentAdmin(OrganizationAdmin):
    list_display = ("code", "name", "company", "is_active")
    list_filter = ("company", "is_active")
    list_select_related = ("company",)
    search_fields = ("code", "name", "company__code", "company__name")
    autocomplete_fields = ("company",)


from .assignment_admin import UserOrganizationAssignmentAdmin  # noqa: E402, F401
