from django.contrib import admin
from django.utils import timezone
from django.utils.html import format_html
from django import forms
from django.contrib.admin import widgets
from .models import Category, Tag, Article

class ArticleAdminForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = [
            'title', 'slug', 'subtitle', 'content', 'featured_image',
            'category', 'tags', 'author', 'status', 'published_date',
            'is_featured', 'meta_description'
        ]
        widgets = {
            'tags': forms.SelectMultiple(attrs={
                'class': 'form-control',
                'size': '8',  
            }),
            'published_date': widgets.AdminSplitDateTime(),
        }
        help_texts = {
            'tags': 'Select relevant tags. Hold Ctrl/Cmd to select multiple tags.',
            'published_date': 'Set the date and time when this article should be published.'
        }

    def clean_published_date(self):
        date = self.cleaned_data.get('published_date')
        return date

    def clean(self):
        return super().clean()

    def is_valid(self):
        return super().is_valid()

# Register your models here.

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name', 'article_count', 'created_at')
    search_fields = ('name', 'description')
    prepopulated_fields = {'slug': ('name',)}
    readonly_fields = ('created_at',)

    def article_count(self, obj):
        count = obj.articles.filter(status='published').count()
        return format_html('<b>{}</b>', count)
    article_count.short_description = 'Articles'

@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    list_display = ('name', 'article_count', 'created_at')
    search_fields = ('name',)
    prepopulated_fields = {'slug': ('name',)}
    readonly_fields = ('created_at',)

    def article_count(self, obj):
        count = obj.articles.filter(status='published').count()
        return format_html('<b>{}</b>', count)
    article_count.short_description = 'Articles'

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    form = ArticleAdminForm
    list_display = ('title', 'author', 'category', 'status_badge', 'is_featured', 
                   'published_date', 'views_count', 'reading_time_display')
    list_filter = ('status', 'category', 'is_featured', 'created_at', 'published_date')
    search_fields = ('title', 'subtitle', 'content', 'meta_description')
    prepopulated_fields = {'slug': ('title',)}
    readonly_fields = ('views_count', 'created_at', 'updated_at')
    filter_horizontal = ('tags',)
    date_hierarchy = 'published_date'
    save_on_top = True
    
    fieldsets = (
        ('Article Content', {
            'fields': ('title', 'slug', 'subtitle', 'content', 'featured_image'),
            'description': 'Enter the main content of your article. The title will be used to generate the URL slug.'
        }),
        ('Categorization', {
            'fields': ('category', 'tags'),
            'description': 'Select a category and relevant tags. Hold Ctrl/Cmd to select multiple tags.'
        }),
        ('Publishing', {
            'fields': ('author', 'status', 'published_date', 'is_featured'),
            'description': 'Set the publication status and date. Articles will only be visible on the site when published.'
        }),
        ('SEO', {
            'fields': ('meta_description',),
            'classes': ('collapse',),
            'description': 'Add a meta description to improve SEO.'
        }),
        ('Statistics', {
            'fields': ('views_count', 'created_at', 'updated_at'),
            'classes': ('collapse',),
            'description': 'View article statistics and timestamps.'
        }),
    )
    
    class Media:
        css = {
            'all': ('css/custom_admin.css',)
        }
        js = ('js/custom_admin.js',)
    
    def status_badge(self, obj):
        colors = {
            'draft': '#e74c3c',
            'published': '#2ecc71',
            'archived': '#95a5a6'
        }
        return format_html(
            '<span style="color: {}; font-weight: bold;">{}</span>',
            colors.get(obj.status, '#666'),
            obj.get_status_display()
        )
    status_badge.short_description = 'Status'
    
    def reading_time_display(self, obj):
        minutes = obj.reading_time
        if minutes < 1:
            return 'Quick read'
        elif minutes == 1:
            return '1 minute'
        else:
            return f'{minutes} minutes'
    reading_time_display.short_description = 'Reading Time'
    
    def save_model(self, request, obj, form, change):
        if not obj.author:
            obj.author = request.user
        super().save_model(request, obj, form, change)
