"""
Organization Admin - Django admin configuration for organizational units.
"""
from django.contrib import admin
from django.utils.html import format_html

from .models import OrganizationalUnit, UserOrganizationalUnit, Company, BusinessPartner


class UserOrganizationalUnitInline(admin.TabularInline):
    """Inline admin for user memberships in an org unit."""
    model = UserOrganizationalUnit
    extra = 0
    autocomplete_fields = ['user']
    fields = ['user', 'is_primary', 'is_manager', 'start_date', 'end_date']


@admin.register(OrganizationalUnit)
class OrganizationalUnitAdmin(admin.ModelAdmin):
    """Admin configuration for OrganizationalUnit."""
    
    list_display = [
        'name', 
        'code', 
        'unit_type', 
        'parent_link',
        'level', 
        'is_active',
        'members_count',
        'created_at',
    ]
    list_filter = ['unit_type', 'is_active', 'level']
    search_fields = ['name', 'code', 'description']
    ordering = ['path', 'name']
    readonly_fields = ['path', 'level', 'created_at', 'updated_at']
    
    fieldsets = (
        (None, {
            'fields': ('name', 'code', 'type', 'description')
        }),
        ('Hierarchy', {
            'fields': ('parent', 'path', 'level')
        }),
        ('Status', {
            'fields': ('is_active',)
        }),
        ('Metadata', {
            'fields': ('metadata',),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )
    
    inlines = [UserOrganizationalUnitInline]
    
    def parent_link(self, obj):
        """Display parent as a link."""
        if obj.parent:
            return format_html(
                '<a href="{}">{}</a>',
                f'/admin/organization/organizationalunit/{obj.parent.id}/change/',
                obj.parent.name
            )
        return '-'
    parent_link.short_description = 'Parent'
    parent_link.admin_order_field = 'parent__name'
    
    def members_count(self, obj):
        """Display count of members."""
        count = obj.members.count()
        return format_html(
            '<a href="{}?org_unit__id__exact={}">{}</a>',
            '/admin/organization/userorganizationalunit/',
            obj.id,
            count
        )
    members_count.short_description = 'Members'


@admin.register(UserOrganizationalUnit)
class UserOrganizationalUnitAdmin(admin.ModelAdmin):
    """Admin configuration for UserOrganizationalUnit."""
    
    list_display = [
        'user',
        'organizational_unit',
        'is_primary',
        'is_manager',
        'start_date',
        'end_date',
        'created_at',
    ]
    list_filter = ['is_primary', 'is_manager', 'organizational_unit__unit_type']
    search_fields = ['user__email', 'user__first_name', 'user__last_name', 'organizational_unit__name']
    autocomplete_fields = ['user', 'organizational_unit']
    date_hierarchy = 'created_at'
    
    fieldsets = (
        (None, {
            'fields': ('user', 'organizational_unit')
        }),
        ('Assignment', {
            'fields': ('is_primary', 'is_manager', 'include_descendants')
        }),
        ('Dates', {
            'fields': ('start_date', 'end_date')
        }),
    )


@admin.register(Company)
class CompanyAdmin(admin.ModelAdmin):
    """Admin configuration for Company."""

    list_display = [
        "name", "code", "national_id", "parent_company",
        "base_currency", "is_active", "created_at",
    ]
    list_filter = ["is_active", "country"]
    search_fields = ["name", "name_en", "code", "national_id"]
    ordering = ["name"]
    autocomplete_fields = ["org_unit", "parent_company", "base_currency"]
    readonly_fields = ["created_at", "updated_at"]

    fieldsets = (
        (None, {"fields": ("name", "name_en", "code")}),
        ("اطلاعات حقوقی", {"fields": (
            "registration_number", "national_id", "economic_code",
        )}),
        ("سازمان و سلسله‌مراتب", {"fields": (
            "org_unit", "parent_company", "base_currency",
        )}),
        ("تماس", {"fields": (
            "address", "city", "province", "country",
            "postal_code", "phone", "fax", "email", "website",
        )}),
        ("وضعیت", {"fields": ("is_active",)}),
        ("متادیتا", {"fields": ("metadata",), "classes": ("collapse",)}),
        ("زمان‌ها", {"fields": ("created_at", "updated_at"), "classes": ("collapse",)}),
    )


@admin.register(BusinessPartner)
class BusinessPartnerAdmin(admin.ModelAdmin):
    """Admin configuration for BusinessPartner."""

    list_display = [
        "name", "code", "partner_type", "company",
        "phone", "is_active", "created_at",
    ]
    list_filter = ["partner_type", "is_active", "country"]
    search_fields = ["name", "name_en", "code", "national_id", "contact_person"]
    ordering = ["name"]
    autocomplete_fields = ["company", "currency"]
    readonly_fields = ["created_at", "updated_at"]

    fieldsets = (
        (None, {"fields": ("name", "name_en", "code", "partner_type")}),
        ("اطلاعات حقوقی", {"fields": (
            "national_id", "economic_code", "tax_id",
        )}),
        ("شرکت", {"fields": ("company",)}),
        ("تماس", {"fields": (
            "contact_person", "phone", "mobile", "fax", "email", "website",
        )}),
        ("آدرس", {"fields": (
            "address", "city", "province", "country", "postal_code",
        )}),
        ("مالی", {"fields": (
            "payment_terms_days", "credit_limit", "currency",
            "bank_name", "bank_account", "sheba",
        )}),
        ("وضعیت", {"fields": ("is_active",)}),
        ("متادیتا", {"fields": ("metadata",), "classes": ("collapse",)}),
        ("زمان‌ها", {"fields": ("created_at", "updated_at"), "classes": ("collapse",)}),
    )
