"""
Django admin integration for cronjob utils.
"""

from django.contrib import admin
from django.utils.html import format_html
from django.urls import reverse
from django.utils import timezone
from datetime import timedelta
from django_cronjob_utils.models import CronExecution


@admin.register(CronExecution)
class CronExecutionAdmin(admin.ModelAdmin):
    """Admin interface for CronExecution model."""
    
    list_display = [
        'task_name_code',
        'execution_date',
        'status_display',
        'started',
        'duration_display',
        'retry_count',
        'error_code',
    ]
    list_filter = [
        'success',
        'completed',
        'task_code',
        'execution_date',
        'error_code',
    ]
    search_fields = [
        'task_name',
        'task_code',
        'message',
        'error_code',
    ]
    readonly_fields = [
        'task_code',
        'task_name',
        'started',
        'ended',
        'completed',
        'success',
        'execution_date',
        'retry_count',
        'pid',
        'duration_display',
    ]
    fieldsets = (
        ('Task Information', {
            'fields': ('task_code', 'task_name', 'execution_date')
        }),
        ('Execution Status', {
            'fields': (
                'started',
                'ended',
                'duration_display',
                'completed',
                'success',
                'retry_count',
                'pid',
            )
        }),
        ('Results', {
            'fields': ('message', 'error_code')
        }),
    )
    
    def task_name_code(self, obj):
        """Display task name and code."""
        return f"{obj.task_name} ({obj.task_code})"
    task_name_code.short_description = 'Task'
    
    def status_display(self, obj):
        """Display execution status with color coding."""
        if not obj.completed:
            return format_html(
                '<span style="color: orange;">→ Running</span>'
            )
        elif obj.success:
            return format_html(
                '<span style="color: green;">✓ Success</span>'
            )
        else:
            return format_html(
                '<span style="color: red;">✗ Failed</span>'
            )
    status_display.short_description = 'Status'
    
    def duration_display(self, obj):
        """Display execution duration."""
        duration = obj.duration
        if duration is None:
            return '-'
        
        if duration < 60:
            return f"{duration:.1f}s"
        elif duration < 3600:
            return f"{duration / 60:.1f}m"
        else:
            return f"{duration / 3600:.1f}h"
    duration_display.short_description = 'Duration'
    
    def get_queryset(self, request):
        """Optimize queryset."""
        return super().get_queryset(request).select_related()
    
    def has_add_permission(self, request):
        """Disable manual creation of execution records."""
        return False
    
    actions = ['mark_as_success', 'mark_as_failed']
    
    def mark_as_success(self, request, queryset):
        """Mark selected executions as successful."""
        count = 0
        for execution in queryset:
            if not execution.completed:
                execution.mark_completed(success=True, message='Manually marked as success')
                count += 1
        
        self.message_user(
            request,
            f"{count} execution(s) marked as successful."
        )
    mark_as_success.short_description = "Mark selected as successful"
    
    def mark_as_failed(self, request, queryset):
        """Mark selected executions as failed."""
        count = 0
        for execution in queryset:
            if not execution.completed:
                execution.mark_failed(message='Manually marked as failed', error_code='MANUAL')
                count += 1
        
        self.message_user(
            request,
            f"{count} execution(s) marked as failed."
        )
    mark_as_failed.short_description = "Mark selected as failed"
