"""
Admin registration for Automation models
"""
from django.contrib import admin
from django.contrib import messages
from unfold.admin import ModelAdmin
from igny8_core.admin.base import AccountAdminMixin, Igny8ModelAdmin
from .models import AutomationConfig, AutomationRun


from import_export.admin import ExportMixin
from import_export import resources


class AutomationConfigResource(resources.ModelResource):
    """Resource class for exporting Automation Configs"""
    class Meta:
        model = AutomationConfig
        fields = ('id', 'site__domain', 'is_enabled', 'frequency', 'scheduled_time',
                  'within_stage_delay', 'between_stage_delay', 'last_run_at', 'created_at')
        export_order = fields


@admin.register(AutomationConfig)
class AutomationConfigAdmin(ExportMixin, AccountAdminMixin, Igny8ModelAdmin):
    resource_class = AutomationConfigResource
    list_display = ('site', 'is_enabled', 'frequency', 'scheduled_time', 'within_stage_delay', 'between_stage_delay', 'last_run_at')
    list_filter = ('is_enabled', 'frequency')
    search_fields = ('site__domain',)
    actions = [
        'bulk_enable',
        'bulk_disable',
        'bulk_update_frequency',
        'bulk_update_delays',
    ]
    
    def bulk_enable(self, request, queryset):
        """Enable selected automation configs"""
        updated = queryset.update(is_enabled=True)
        self.message_user(request, f'{updated} automation config(s) enabled.', messages.SUCCESS)
    bulk_enable.short_description = 'Enable selected automations'
    
    def bulk_disable(self, request, queryset):
        """Disable selected automation configs"""
        updated = queryset.update(is_enabled=False)
        self.message_user(request, f'{updated} automation config(s) disabled.', messages.SUCCESS)
    bulk_disable.short_description = 'Disable selected automations'
    
    def bulk_update_frequency(self, request, queryset):
        """Update frequency for selected automation configs"""
        from django import forms
        
        if 'apply' in request.POST:
            frequency = request.POST.get('frequency')
            if frequency:
                updated = queryset.update(frequency=frequency)
                self.message_user(request, f'{updated} automation config(s) updated to frequency: {frequency}', messages.SUCCESS)
                return
        
        FREQUENCY_CHOICES = [
            ('hourly', 'Hourly'),
            ('daily', 'Daily'),
            ('weekly', 'Weekly'),
        ]
        
        class FrequencyForm(forms.Form):
            frequency = forms.ChoiceField(
                choices=FREQUENCY_CHOICES,
                label="Select Frequency",
                help_text=f"Update frequency for {queryset.count()} automation config(s)"
            )
        
        from django.shortcuts import render
        return render(request, 'admin/bulk_action_form.html', {
            'title': 'Update Automation Frequency',
            'queryset': queryset,
            'form': FrequencyForm(),
            'action': 'bulk_update_frequency',
        })
    bulk_update_frequency.short_description = 'Update frequency'
    
    def bulk_update_delays(self, request, queryset):
        """Update delay settings for selected automation configs"""
        from django import forms
        
        if 'apply' in request.POST:
            within_delay = int(request.POST.get('within_stage_delay', 0))
            between_delay = int(request.POST.get('between_stage_delay', 0))
            
            updated = queryset.update(
                within_stage_delay=within_delay,
                between_stage_delay=between_delay
            )
            self.message_user(request, f'{updated} automation config(s) delay settings updated.', messages.SUCCESS)
            return
        
        class DelayForm(forms.Form):
            within_stage_delay = forms.IntegerField(
                min_value=0,
                initial=10,
                label="Within Stage Delay (minutes)",
                help_text="Delay between operations within the same stage"
            )
            between_stage_delay = forms.IntegerField(
                min_value=0,
                initial=60,
                label="Between Stage Delay (minutes)",
                help_text="Delay between different stages"
            )
        
        from django.shortcuts import render
        return render(request, 'admin/bulk_action_form.html', {
            'title': 'Update Automation Delays',
            'queryset': queryset,
            'form': DelayForm(),
            'action': 'bulk_update_delays',
        })
    bulk_update_delays.short_description = 'Update delay settings'


class AutomationRunResource(resources.ModelResource):
    """Resource class for exporting Automation Runs"""
    class Meta:
        model = AutomationRun
        fields = ('id', 'run_id', 'site__domain', 'status', 'current_stage',
                  'started_at', 'completed_at', 'created_at')
        export_order = fields


@admin.register(AutomationRun)
class AutomationRunAdmin(ExportMixin, AccountAdminMixin, Igny8ModelAdmin):
    resource_class = AutomationRunResource
    list_display = ('run_id', 'site', 'status', 'current_stage', 'started_at', 'completed_at')
    list_filter = ('status', 'current_stage')
    search_fields = ('run_id', 'site__domain')
    actions = [
        'bulk_retry_failed',
        'bulk_cancel_running',
        'bulk_delete_old_runs',
    ]
    
    def bulk_retry_failed(self, request, queryset):
        """Retry failed automation runs"""
        failed_runs = queryset.filter(status='failed')
        count = failed_runs.update(status='pending', current_stage='keyword_research')
        self.message_user(request, f'{count} failed run(s) marked for retry.', messages.SUCCESS)
    bulk_retry_failed.short_description = 'Retry failed runs'
    
    def bulk_cancel_running(self, request, queryset):
        """Cancel running automation runs"""
        running = queryset.filter(status__in=['pending', 'running'])
        count = running.update(status='failed')
        self.message_user(request, f'{count} running automation(s) cancelled.', messages.SUCCESS)
    bulk_cancel_running.short_description = 'Cancel running automations'
    
    def bulk_delete_old_runs(self, request, queryset):
        """Delete automation runs older than 30 days"""
        from django.utils import timezone
        from datetime import timedelta
        
        cutoff_date = timezone.now() - timedelta(days=30)
        old_runs = queryset.filter(created_at__lt=cutoff_date)
        count = old_runs.count()
        old_runs.delete()
        self.message_user(request, f'{count} old automation run(s) deleted (older than 30 days).', messages.SUCCESS)
    bulk_delete_old_runs.short_description = 'Delete old runs (>30 days)'