# -*- coding: utf-8 -*-
"""
Advertisers App Admin Configuration

This module configures the Django admin interface for the Advertisers application.
It provides comprehensive admin interfaces for managing advertisers, agencies,
brands, and their relationships.
"""

from django.contrib import admin
from django.utils.html import format_html
from django.urls import reverse
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
from django.db.models import Count, Sum
from django.contrib.admin import SimpleListFilter

from .models import (
    BrandCategory,
    Agency,
    Advertiser,
    Brand,
    AdvertiserContact,
    AgencyUser,
    AdvertiserBilling
)


class ActiveFilter(SimpleListFilter):
    """
    Custom filter for active/inactive status across all models.
    """
    title = _('Status')
    parameter_name = 'is_active'

    def lookups(self, request, model_admin):
        """Define filter options."""
        return (
            ('1', _('Active')),
            ('0', _('Inactive')),
        )

    def queryset(self, request, queryset):
        """Filter queryset based on selection."""
        if self.value() == '1':
            return queryset.filter(is_active=True)
        if self.value() == '0':
            return queryset.filter(is_active=False)
        return queryset


class AdvertiserTypeFilter(SimpleListFilter):
    """
    Custom filter for advertiser types.
    """
    title = _('Advertiser Type')
    parameter_name = 'advertiser_type'

    def lookups(self, request, model_admin):
        """Define filter options based on advertiser types."""
        return Advertiser.ADVERTISER_TYPES

    def queryset(self, request, queryset):
        """Filter queryset based on advertiser type."""
        if self.value():
            return queryset.filter(advertiser_type=self.value())
        return queryset


# Inline admin classes
class AdvertiserContactInline(admin.TabularInline):
    """
    Inline admin for advertiser contacts.
    """
    model = AdvertiserContact
    extra = 1
    fields = (
        'contact_type', 'first_name', 'last_name', 'title',
        'email', 'phone', 'mobile', 'is_active'
    )
    readonly_fields = ('created_at', 'updated_at')


class BrandInline(admin.TabularInline):
    """
    Inline admin for brands under advertisers.
    """
    model = Brand
    extra = 0
    fields = ('name', 'code', 'category', 'is_active')
    readonly_fields = ('created_at', 'updated_at')
    show_change_link = True


class AgencyUserInline(admin.TabularInline):
    """
    Inline admin for agency users.
    """
    model = AgencyUser
    extra = 0
    fields = (
        'user', 'role', 'can_create_campaigns', 'can_manage_advertisers',
        'can_view_reports', 'can_manage_billing', 'is_active'
    )
    readonly_fields = ('joined_at', 'created_at', 'updated_at')


class AdvertiserInline(admin.TabularInline):
    """
    Inline admin for advertisers under agencies.
    """
    model = Advertiser
    extra = 0
    fields = ('name', 'code', 'advertiser_type', 'is_active')
    readonly_fields = ('created_at', 'updated_at')
    show_change_link = True


# Main admin classes
@admin.register(BrandCategory)
class BrandCategoryAdmin(admin.ModelAdmin):
    """
    Admin interface for brand categories.
    """
    list_display = (
        'name', 'parent', 'full_path_display', 'brands_count',
        'order', 'is_active', 'created_at'
    )
    list_filter = (ActiveFilter, 'parent')
    search_fields = ('name', 'description')
    ordering = ('order', 'name')
    prepopulated_fields = {}
    
    fieldsets = (
        (_('Basic Information'), {
            'fields': ('name', 'parent', 'description')
        }),
        (_('Display Settings'), {
            'fields': ('order', 'is_active')
        }),
        (_('Timestamps'), {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )
    
    readonly_fields = ('created_at', 'updated_at')
    
    def full_path_display(self, obj):
        """Display the full hierarchical path."""
        return obj.full_path
    full_path_display.short_description = _('Full Path')
    
    def brands_count(self, obj):
        """Display the number of brands in this category."""
        count = obj.brands.filter(is_active=True).count()
        if count > 0:
            url = reverse('admin:advertisers_brand_changelist')
            return format_html(
                '<a href="{}?category__id__exact={}">{} brands</a>',
                url, obj.pk, count
            )
        return '0 brands'
    brands_count.short_description = _('Brands')


@admin.register(Agency)
class AgencyAdmin(admin.ModelAdmin):
    """
    Admin interface for agencies.
    """
    list_display = (
        'name', 'code', 'email', 'city', 'country',
        'advertisers_count', 'commission_rate', 'is_active', 'created_at'
    )
    list_filter = (ActiveFilter, 'country', 'commission_rate')
    search_fields = ('name', 'code', 'email', 'city')
    ordering = ('name',)
    
    fieldsets = (
        (_('Basic Information'), {
            'fields': ('name', 'code', 'description')
        }),
        (_('Contact Information'), {
            'fields': ('email', 'phone', 'website')
        }),
        (_('Address'), {
            'fields': ('address', 'city', 'country')
        }),
        (_('Business Settings'), {
            'fields': ('commission_rate', 'is_active')
        }),
        (_('Tracking'), {
            'fields': ('created_by', 'created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )
    
    readonly_fields = ('created_at', 'updated_at')
    inlines = [AgencyUserInline, AdvertiserInline]
    
    def advertisers_count(self, obj):
        """Display the number of advertisers managed by this agency."""
        count = obj.advertisers.filter(is_active=True).count()
        if count > 0:
            url = reverse('admin:advertisers_advertiser_changelist')
            return format_html(
                '<a href="{}?agency__id__exact={}">{} advertisers</a>',
                url, obj.pk, count
            )
        return '0 advertisers'
    advertisers_count.short_description = _('Advertisers')
    
    def get_queryset(self, request):
        """Optimize queryset with related data."""
        queryset = super().get_queryset(request)
        return queryset.select_related('created_by').prefetch_related('advertisers')


@admin.register(Advertiser)
class AdvertiserAdmin(admin.ModelAdmin):
    """
    Admin interface for advertisers.
    """
    list_display = (
        'name', 'code', 'advertiser_type', 'agency_link',
        'email', 'brands_count', 'credit_limit', 'is_active', 'created_at'
    )
    list_filter = (
        ActiveFilter, AdvertiserTypeFilter, 'agency',
        'industry', 'country'
    )
    search_fields = ('name', 'code', 'email', 'industry')
    ordering = ('name',)
    
    fieldsets = (
        (_('Basic Information'), {
            'fields': ('name', 'code', 'advertiser_type', 'agency')
        }),
        (_('Contact Information'), {
            'fields': ('email', 'phone', 'website')
        }),
        (_('Address'), {
            'fields': ('address', 'city', 'country')
        }),
        (_('Business Information'), {
            'fields': ('industry', 'description')
        }),
        (_('Financial Settings'), {
            'fields': ('credit_limit',)
        }),
        (_('Status & Tracking'), {
            'fields': ('is_active', 'created_by', 'created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )
    
    readonly_fields = ('created_at', 'updated_at')
    inlines = [AdvertiserContactInline, BrandInline]
    
    def agency_link(self, obj):
        """Display agency as a clickable link."""
        if obj.agency:
            url = reverse('admin:advertisers_agency_change', args=[obj.agency.pk])
            return format_html('<a href="{}">{}</a>', url, obj.agency.name)
        return '-'
    agency_link.short_description = _('Agency')
    agency_link.admin_order_field = 'agency__name'
    
    def brands_count(self, obj):
        """Display the number of brands for this advertiser."""
        count = obj.brands.filter(is_active=True).count()
        if count > 0:
            url = reverse('admin:advertisers_brand_changelist')
            return format_html(
                '<a href="{}?advertiser__id__exact={}">{} brands</a>',
                url, obj.pk, count
            )
        return '0 brands'
    brands_count.short_description = _('Brands')
    
    def get_queryset(self, request):
        """Optimize queryset with related data."""
        queryset = super().get_queryset(request)
        return queryset.select_related('agency', 'created_by').prefetch_related('brands')


@admin.register(Brand)
class BrandAdmin(admin.ModelAdmin):
    """
    Admin interface for brands.
    """
    list_display = (
        'name', 'code', 'advertiser_link', 'category',
        'logo_preview', 'primary_color_preview', 'is_active', 'created_at'
    )
    list_filter = (ActiveFilter, 'category', 'advertiser__agency')
    search_fields = ('name', 'code', 'advertiser__name', 'description')
    ordering = ('name',)
    
    fieldsets = (
        (_('Basic Information'), {
            'fields': ('name', 'code', 'advertiser', 'category')
        }),
        (_('Brand Details'), {
            'fields': ('description', 'website')
        }),
        (_('Brand Assets'), {
            'fields': ('logo', 'primary_color', 'secondary_color')
        }),
        (_('Status & Tracking'), {
            'fields': ('is_active', 'created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )
    
    readonly_fields = ('created_at', 'updated_at')
    
    def advertiser_link(self, obj):
        """Display advertiser as a clickable link."""
        url = reverse('admin:advertisers_advertiser_change', args=[obj.advertiser.pk])
        return format_html('<a href="{}">{}</a>', url, obj.advertiser.name)
    advertiser_link.short_description = _('Advertiser')
    advertiser_link.admin_order_field = 'advertiser__name'
    
    def logo_preview(self, obj):
        """Display a small preview of the brand logo."""
        if obj.logo:
            return format_html(
                '<img src="{}" style="max-height: 30px; max-width: 50px;"/>',
                obj.logo.url
            )
        return '-'
    logo_preview.short_description = _('Logo')
    
    def primary_color_preview(self, obj):
        """Display a preview of the primary color."""
        if obj.primary_color:
            return format_html(
                '<div style="width: 20px; height: 20px; background-color: {}; border: 1px solid #ccc; display: inline-block;"></div> {}',
                obj.primary_color, obj.primary_color
            )
        return '-'
    primary_color_preview.short_description = _('Primary Color')
    
    def get_queryset(self, request):
        """Optimize queryset with related data."""
        queryset = super().get_queryset(request)
        return queryset.select_related('advertiser', 'category')


@admin.register(AdvertiserContact)
class AdvertiserContactAdmin(admin.ModelAdmin):
    """
    Admin interface for advertiser contacts.
    """
    list_display = (
        'full_name', 'contact_type', 'advertiser_link',
        'email', 'phone', 'is_active', 'created_at'
    )
    list_filter = (ActiveFilter, 'contact_type', 'advertiser')
    search_fields = (
        'first_name', 'last_name', 'email', 'advertiser__name'
    )
    ordering = ('advertiser', 'contact_type', 'last_name', 'first_name')
    
    fieldsets = (
        (_('Basic Information'), {
            'fields': ('advertiser', 'contact_type')
        }),
        (_('Personal Information'), {
            'fields': ('first_name', 'last_name', 'title')
        }),
        (_('Contact Information'), {
            'fields': ('email', 'phone', 'mobile')
        }),
        (_('Status & Tracking'), {
            'fields': ('is_active', 'created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )
    
    readonly_fields = ('created_at', 'updated_at')
    
    def advertiser_link(self, obj):
        """Display advertiser as a clickable link."""
        url = reverse('admin:advertisers_advertiser_change', args=[obj.advertiser.pk])
        return format_html('<a href="{}">{}</a>', url, obj.advertiser.name)
    advertiser_link.short_description = _('Advertiser')
    advertiser_link.admin_order_field = 'advertiser__name'
    
    def get_queryset(self, request):
        """Optimize queryset with related data."""
        queryset = super().get_queryset(request)
        return queryset.select_related('advertiser')


@admin.register(AgencyUser)
class AgencyUserAdmin(admin.ModelAdmin):
    """
    Admin interface for agency users.
    """
    list_display = (
        'user_full_name', 'agency_link', 'role',
        'permissions_summary', 'is_active', 'joined_at'
    )
    list_filter = (ActiveFilter, 'role', 'agency')
    search_fields = (
        'user__first_name', 'user__last_name', 'user__email',
        'agency__name'
    )
    ordering = ('agency', 'role', 'user__last_name')
    
    fieldsets = (
        (_('Basic Information'), {
            'fields': ('user', 'agency', 'role')
        }),
        (_('Permissions'), {
            'fields': (
                'can_create_campaigns', 'can_manage_advertisers',
                'can_view_reports', 'can_manage_billing'
            )
        }),
        (_('Status & Tracking'), {
            'fields': ('is_active', 'joined_at', 'created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )
    
    readonly_fields = ('joined_at', 'created_at', 'updated_at')
    
    def user_full_name(self, obj):
        """Display user's full name."""
        return obj.user.get_full_name() or obj.user.username
    user_full_name.short_description = _('User')
    user_full_name.admin_order_field = 'user__last_name'
    
    def agency_link(self, obj):
        """Display agency as a clickable link."""
        url = reverse('admin:advertisers_agency_change', args=[obj.agency.pk])
        return format_html('<a href="{}">{}</a>', url, obj.agency.name)
    agency_link.short_description = _('Agency')
    agency_link.admin_order_field = 'agency__name'
    
    def permissions_summary(self, obj):
        """Display a summary of user permissions."""
        permissions = []
        if obj.can_create_campaigns:
            permissions.append('Campaigns')
        if obj.can_manage_advertisers:
            permissions.append('Advertisers')
        if obj.can_view_reports:
            permissions.append('Reports')
        if obj.can_manage_billing:
            permissions.append('Billing')
        
        if permissions:
            return ', '.join(permissions)
        return 'View Only'
    permissions_summary.short_description = _('Permissions')
    
    def get_queryset(self, request):
        """Optimize queryset with related data."""
        queryset = super().get_queryset(request)
        return queryset.select_related('user', 'agency')


@admin.register(AdvertiserBilling)
class AdvertiserBillingAdmin(admin.ModelAdmin):
    """
    Admin interface for advertiser billing information.
    """
    list_display = (
        'advertiser_link', 'billing_name', 'payment_method',
        'billing_cycle', 'credit_limit', 'current_balance',
        'available_credit_display', 'is_active'
    )
    list_filter = (ActiveFilter, 'payment_method', 'billing_cycle')
    search_fields = (
        'advertiser__name', 'billing_name', 'tax_id'
    )
    ordering = ('advertiser__name',)
    
    fieldsets = (
        (_('Advertiser'), {
            'fields': ('advertiser',)
        }),
        (_('Billing Information'), {
            'fields': ('billing_name', 'billing_address', 'tax_id')
        }),
        (_('Payment Settings'), {
            'fields': ('payment_method', 'billing_cycle')
        }),
        (_('Financial Information'), {
            'fields': ('credit_limit', 'current_balance')
        }),
        (_('Status & Tracking'), {
            'fields': ('is_active', 'created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )
    
    readonly_fields = ('created_at', 'updated_at')
    
    def advertiser_link(self, obj):
        """Display advertiser as a clickable link."""
        url = reverse('admin:advertisers_advertiser_change', args=[obj.advertiser.pk])
        return format_html('<a href="{}">{}</a>', url, obj.advertiser.name)
    advertiser_link.short_description = _('Advertiser')
    advertiser_link.admin_order_field = 'advertiser__name'
    
    def available_credit_display(self, obj):
        """Display available credit with color coding."""
        available = obj.available_credit
        if available < 0:
            color = 'red'
        elif available < obj.credit_limit * 0.1:  # Less than 10% remaining
            color = 'orange'
        else:
            color = 'green'
        
        return format_html(
            '<span style="color: {};">${:,.2f}</span>',
            color, available
        )
    available_credit_display.short_description = _('Available Credit')
    
    def get_queryset(self, request):
        """Optimize queryset with related data."""
        queryset = super().get_queryset(request)
        return queryset.select_related('advertiser')


# Admin site customization
admin.site.site_header = _('Ad-tlas Advertisers Administration')
admin.site.site_title = _('Ad-tlas Advertisers Admin')
admin.site.index_title = _('Welcome to Ad-tlas Advertisers Administration')