from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Group
from django.utils.html import format_html
from django.urls import reverse
from django.db.models import Count
from django.utils import timezone
from datetime import timedelta
from .models import User  # Import your custom user model


class JoinDateFilter(admin.SimpleListFilter):
    """Custom filter for join date with common time ranges"""
    title = 'join date'
    parameter_name = 'join_date'

    def lookups(self, request, model_admin):
        return (
            ('today', 'Today'),
            ('week', 'Past 7 days'),
            ('month', 'Past month'),
            ('quarter', 'Past 3 months'),
            ('year', 'Past year'),
        )

    def queryset(self, request, queryset):
        now = timezone.now()
        
        if self.value() == 'today':
            return queryset.filter(date_joined__date=now.date())
        elif self.value() == 'week':
            return queryset.filter(date_joined__gte=now - timedelta(days=7))
        elif self.value() == 'month':
            return queryset.filter(date_joined__gte=now - timedelta(days=30))
        elif self.value() == 'quarter':
            return queryset.filter(date_joined__gte=now - timedelta(days=90))
        elif self.value() == 'year':
            return queryset.filter(date_joined__gte=now - timedelta(days=365))
        
        return queryset


class LastLoginFilter(admin.SimpleListFilter):
    """Custom filter for last login with common time ranges"""
    title = 'last login'
    parameter_name = 'last_login_range'

    def lookups(self, request, model_admin):
        return (
            ('today', 'Today'),
            ('week', 'Past 7 days'),
            ('month', 'Past month'),
            ('never', 'Never logged in'),
        )

    def queryset(self, request, queryset):
        now = timezone.now()
        
        if self.value() == 'today':
            return queryset.filter(last_login__date=now.date())
        elif self.value() == 'week':
            return queryset.filter(last_login__gte=now - timedelta(days=7))
        elif self.value() == 'month':
            return queryset.filter(last_login__gte=now - timedelta(days=30))
        elif self.value() == 'never':
            return queryset.filter(last_login__isnull=True)
        
        return queryset

class MainUserAdmin(UserAdmin):
    model = User
    list_display = ['phone', 'email', 'first_name', 'last_name', 'ref', 'bazi_persons_link', 'date_joined', 'last_login', 'last_active_date', 'is_staff', 'is_active']
    list_filter = ('is_staff', 'is_active', 'groups', JoinDateFilter, LastLoginFilter, 'date_joined', 'last_login', 'last_active_date')
    date_hierarchy = 'date_joined'
    fieldsets = (
        ('Details', {'fields': ('phone', 'email', 'first_name', 'last_name')}),
        ('Network', {'fields': ('ref',)}),
        ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('phone', 'email', 'first_name', 'last_name', 'password1', 'password2', 'is_staff', 'is_active', 'groups')}
        ),
    )
    search_fields = ('phone', 'email', 'first_name', 'last_name')
    ordering = ('email',)
    filter_horizontal = ('groups', 'user_permissions',)
    
    def get_queryset(self, request):
        """Override get_queryset to add person count annotation for sorting"""
        from bazi.models import Person
        queryset = super().get_queryset(request)
        queryset = queryset.annotate(
            person_count=Count('person', distinct=True)
        )
        return queryset
    
    def bazi_persons_link(self, obj):
        """Create a link to the BaZi person list filtered by this user"""
        try:
            # Count the number of persons created by this user
            from bazi.models import Person
            person_count = Person.objects.filter(created_by=obj).count()
            
            if person_count == 0:
                return format_html('<span style="color: #666;">No persons</span>')
            
            # Generate the admin URL for bazi person list with filter
            url = reverse('admin:bazi_person_changelist')
            filtered_url = f"{url}?created_by__exact={obj.pk}"
            
            return format_html(
                '<a href="{}" style="text-decoration: none; padding: 4px 8px; background-color: #007cba; color: white; border-radius: 3px; font-size: 11px;">'
                '{} person{}</a>',
                filtered_url,
                person_count,
                's' if person_count != 1 else ''
            )
        except Exception as e:
            return format_html('<span style="color: red;">Error: {}</span>', str(e))
    
    bazi_persons_link.short_description = 'BaZi Persons'
    bazi_persons_link.admin_order_field = 'person_count'  # This enables sorting by person count

# Register your custom user model with the custom admin class
admin.site.register(User, MainUserAdmin)
