# -*- coding: utf-8 -*-
"""
Campaigns Admin Configuration

Django admin interface configuration for campaign models.
Provides comprehensive admin interface for managing campaigns.
"""

from django.contrib import admin
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from django.urls import reverse
from django.utils import timezone

from .models import Campaign, CampaignChannelSchedule, CampaignPerformance


class CampaignChannelScheduleInline(admin.TabularInline):
    """
    Inline admin for campaign channel schedules.
    """
    model = CampaignChannelSchedule
    extra = 1
    fields = [
        'channel', 'start_time', 'end_time', 'days_of_week',
        'spots_per_day', 'channel_budget', 'impressions_delivered', 'amount_spent'
    ]
    readonly_fields = ['impressions_delivered', 'amount_spent']


class CampaignPerformanceInline(admin.TabularInline):
    """
    Inline admin for campaign performance records.
    """
    model = CampaignPerformance
    extra = 0
    fields = ['date', 'impressions', 'spots_aired', 'spend', 'cpm', 'reach', 'frequency']
    readonly_fields = ['cpm']
    ordering = ['-date']
    
    def has_add_permission(self, request, obj=None):
        return False


@admin.register(Campaign)
class CampaignAdmin(admin.ModelAdmin):
    """
    Admin interface for Campaign model.
    """
    
    list_display = [
        'name', 'advertiser', 'campaign_type', 'status_badge', 'priority',
        'start_date', 'end_date', 'total_budget', 'budget_utilization_display',
        'total_impressions', 'is_active_display'
    ]
    
    list_filter = [
        'status', 'campaign_type', 'priority', 'start_date', 'end_date',
        'advertiser', 'created_at'
    ]
    
    search_fields = [
        'name', 'description', 'advertiser__name', 'advertiser__company_name'
    ]
    
    readonly_fields = [
        'id', 'total_impressions', 'total_spend', 'budget_utilization_display',
        'days_remaining_display', 'created_at', 'updated_at'
    ]
    
    fieldsets = [
        (_('Basic Information'), {
            'fields': [
                'name', 'description', 'campaign_type', 'advertiser'
            ]
        }),
        (_('Schedule'), {
            'fields': [
                'start_date', 'end_date', 'days_remaining_display'
            ]
        }),
        (_('Budget & Pricing'), {
            'fields': [
                'total_budget', 'daily_budget', 'cost_per_spot',
                'total_spend', 'budget_utilization_display'
            ]
        }),
        (_('Status & Priority'), {
            'fields': [
                'status', 'priority'
            ]
        }),
        (_('Targeting'), {
            'fields': [
                'geographic_zones', 'target_demographics'
            ],
            'classes': ['collapse']
        }),
        (_('Performance'), {
            'fields': [
                'total_impressions'
            ],
            'classes': ['collapse']
        }),
        (_('Notes'), {
            'fields': [
                'notes'
            ],
            'classes': ['collapse']
        }),
        (_('System Information'), {
            'fields': [
                'id', 'created_at', 'updated_at'
            ],
            'classes': ['collapse']
        })
    ]
    
    inlines = [CampaignChannelScheduleInline, CampaignPerformanceInline]
    
    filter_horizontal = ['geographic_zones']
    
    date_hierarchy = 'start_date'
    
    actions = ['activate_campaigns', 'pause_campaigns', 'mark_completed']
    
    def status_badge(self, obj):
        """Display status as colored badge."""
        colors = {
            'draft': 'gray',
            'pending': 'orange',
            'approved': 'blue',
            'active': 'green',
            'paused': 'yellow',
            'completed': 'purple',
            'cancelled': 'red'
        }
        color = colors.get(obj.status, 'gray')
        return format_html(
            '<span style="background-color: {}; color: white; padding: 2px 8px; '
            'border-radius: 3px; font-size: 11px;">{}</span>',
            color, obj.get_status_display()
        )
    status_badge.short_description = _('Status')
    
    def budget_utilization_display(self, obj):
        """Display budget utilization as percentage."""
        utilization = obj.budget_utilization
        color = 'green' if utilization < 80 else 'orange' if utilization < 100 else 'red'
        return format_html(
            '<span style="color: {};">{:.1f}%</span>',
            color, utilization
        )
    budget_utilization_display.short_description = _('Budget Used')
    
    def is_active_display(self, obj):
        """Display active status as icon."""
        if obj.is_active:
            return format_html('<span style="color: green;">✓ Active</span>')
        return format_html('<span style="color: gray;">○ Inactive</span>')
    is_active_display.short_description = _('Currently Active')
    
    def days_remaining_display(self, obj):
        """Display days remaining in campaign."""
        days = obj.days_remaining
        if days > 7:
            color = 'green'
        elif days > 3:
            color = 'orange'
        else:
            color = 'red'
        return format_html(
            '<span style="color: {};">{} days</span>',
            color, days
        )
    days_remaining_display.short_description = _('Days Remaining')
    
    def activate_campaigns(self, request, queryset):
        """Bulk action to activate campaigns."""
        count = 0
        for campaign in queryset:
            if campaign.can_be_activated():
                campaign.status = 'active'
                campaign.save()
                count += 1
        
        self.message_user(
            request,
            f'{count} campaigns were successfully activated.'
        )
    activate_campaigns.short_description = _('Activate selected campaigns')
    
    def pause_campaigns(self, request, queryset):
        """Bulk action to pause campaigns."""
        count = queryset.filter(status='active').update(status='paused')
        self.message_user(
            request,
            f'{count} campaigns were successfully paused.'
        )
    pause_campaigns.short_description = _('Pause selected campaigns')
    
    def mark_completed(self, request, queryset):
        """Bulk action to mark campaigns as completed."""
        count = queryset.exclude(status__in=['completed', 'cancelled']).update(
            status='completed'
        )
        self.message_user(
            request,
            f'{count} campaigns were marked as completed.'
        )
    mark_completed.short_description = _('Mark selected campaigns as completed')


@admin.register(CampaignChannelSchedule)
class CampaignChannelScheduleAdmin(admin.ModelAdmin):
    """
    Admin interface for Campaign Channel Schedule model.
    """
    
    list_display = [
        'campaign', 'channel', 'start_time', 'end_time',
        'spots_per_day', 'channel_budget', 'impressions_delivered', 'amount_spent'
    ]
    
    list_filter = [
        'campaign__status', 'channel', 'start_time', 'end_time', 'spots_per_day'
    ]
    
    search_fields = [
        'campaign__name', 'channel__name', 'channel__call_sign'
    ]
    
    readonly_fields = ['impressions_delivered', 'amount_spent']
    
    fieldsets = [
        (_('Campaign & Channel'), {
            'fields': ['campaign', 'channel']
        }),
        (_('Schedule'), {
            'fields': ['start_time', 'end_time', 'days_of_week']
        }),
        (_('Frequency & Budget'), {
            'fields': ['spots_per_day', 'channel_budget']
        }),
        (_('Performance'), {
            'fields': ['impressions_delivered', 'amount_spent'],
            'classes': ['collapse']
        })
    ]


@admin.register(CampaignPerformance)
class CampaignPerformanceAdmin(admin.ModelAdmin):
    """
    Admin interface for Campaign Performance model.
    """
    
    list_display = [
        'campaign', 'date', 'impressions', 'spots_aired',
        'spend', 'cpm', 'reach', 'frequency'
    ]
    
    list_filter = [
        'date', 'campaign__status', 'campaign__advertiser'
    ]
    
    search_fields = [
        'campaign__name', 'campaign__advertiser__name'
    ]
    
    readonly_fields = ['cpm']
    
    date_hierarchy = 'date'
    
    fieldsets = [
        (_('Campaign & Date'), {
            'fields': ['campaign', 'date']
        }),
        (_('Performance Metrics'), {
            'fields': ['impressions', 'spots_aired', 'spend', 'cpm']
        }),
        (_('Audience Metrics'), {
            'fields': ['reach', 'frequency'],
            'classes': ['collapse']
        })
    ]
    
    def has_add_permission(self, request):
        """Disable manual addition of performance records."""
        return False