from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import Group
from django.utils.html import format_html
from django.urls import reverse
from django.utils.safestring import mark_safe
from .models import User, Role, UserRole, UserProfile


class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'Profile'
    fields = (
        'company', 'job_title', 'website', 'location',
        'linkedin_url', 'twitter_url', 'github_url',
        'profile_visibility'
    )


class UserRoleInline(admin.TabularInline):
    model = UserRole
    extra = 0
    fields = ('role', 'assigned_by', 'assigned_at', 'expires_at')
    readonly_fields = ('assigned_at',)
    autocomplete_fields = ('assigned_by',)


@admin.register(User)
class UserAdmin(BaseUserAdmin):
    inlines = (UserProfileInline, UserRoleInline)
    list_display = (
        'email', 'full_name', 'is_active', 'is_staff', 
        'email_verified', 'last_login', 'created_at', 'avatar_preview'
    )
    list_filter = (
        'is_active', 'is_staff', 'is_superuser', 'email_verified',
        'created_at', 'last_login', 'user_roles__role__name'
    )
    search_fields = ('email', 'first_name', 'last_name', 'phone_number')
    ordering = ('-created_at',)
    filter_horizontal = ('groups', 'user_permissions')
    readonly_fields = (
        'id', 'last_login', 'created_at', 'updated_at', 
        'failed_login_attempts', 'last_login_ip', 'avatar_preview'
    )
    
    fieldsets = (
        (None, {
            'fields': ('id', 'email', 'password')
        }),
        ('Personal Info', {
            'fields': (
                'first_name', 'last_name', 'phone_number', 
                'avatar', 'avatar_preview', 'bio', 'birth_date'
            )
        }),
        ('Account Status', {
            'fields': (
                'is_active', 'is_staff', 'is_superuser',
                'email_verified', 'email_verification_token'
            )
        }),
        ('Security', {
            'fields': (
                'last_login', 'last_login_ip', 'failed_login_attempts',
                'account_locked_until'
            )
        }),
        ('Preferences', {
            'fields': ('timezone', 'language', 'receive_notifications')
        }),
        ('Permissions', {
            'fields': ('groups', 'user_permissions'),
            'classes': ('collapse',)
        }),
        ('Important Dates', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )
    
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': (
                'email', 'first_name', 'last_name', 
                'password1', 'password2', 'is_active', 'email_verified'
            ),
        }),
    )

    def avatar_preview(self, obj):
        if obj.avatar:
            return format_html(
                '<img src="{}" style="width: 50px; height: 50px; border-radius: 50%;" />',
                obj.avatar.url
            )
        return "No Avatar"
    avatar_preview.short_description = "Avatar"

    def get_queryset(self, request):
        return super().get_queryset(request).select_related('profile')

    actions = ['activate_users', 'deactivate_users', 'verify_emails']

    def activate_users(self, request, queryset):
        updated = queryset.update(is_active=True)
        self.message_user(request, f'{updated} users were successfully activated.')
    activate_users.short_description = "Activate selected users"

    def deactivate_users(self, request, queryset):
        updated = queryset.update(is_active=False)
        self.message_user(request, f'{updated} users were successfully deactivated.')
    deactivate_users.short_description = "Deactivate selected users"

    def verify_emails(self, request, queryset):
        updated = queryset.update(email_verified=True, email_verification_token='')
        self.message_user(request, f'{updated} user emails were successfully verified.')
    verify_emails.short_description = "Verify selected user emails"


@admin.register(Role)
class RoleAdmin(admin.ModelAdmin):
    list_display = ('name', 'description', 'is_default', 'permission_count', 'user_count')
    list_filter = ('is_default', 'created_at')
    search_fields = ('name', 'description')
    filter_horizontal = ('permissions',)
    readonly_fields = ('created_at', 'updated_at')
    
    fieldsets = (
        (None, {
            'fields': ('name', 'description', 'is_default')
        }),
        ('Permissions', {
            'fields': ('permissions',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )

    def permission_count(self, obj):
        return obj.permissions.count()
    permission_count.short_description = "Permissions"

    def user_count(self, obj):
        count = obj.role_users.count()
        url = reverse('admin:accounts_userrole_changelist') + f'?role__id__exact={obj.id}'
        return format_html('<a href="{}">{}</a>', url, count)
    user_count.short_description = "Users"


@admin.register(UserRole)
class UserRoleAdmin(admin.ModelAdmin):
    list_display = ('user', 'role', 'assigned_by', 'assigned_at', 'expires_at', 'is_expired')
    list_filter = ('role', 'assigned_at', 'expires_at')
    search_fields = ('user__email', 'user__first_name', 'user__last_name', 'role__name')
    autocomplete_fields = ('user', 'assigned_by')
    readonly_fields = ('assigned_at', 'is_expired')
    date_hierarchy = 'assigned_at'
    
    fieldsets = (
        (None, {
            'fields': ('user', 'role', 'assigned_by')
        }),
        ('Timing', {
            'fields': ('assigned_at', 'expires_at', 'is_expired')
        }),
    )

    def is_expired(self, obj):
        if obj.expires_at:
            expired = obj.is_expired
            color = 'red' if expired else 'green'
            text = 'Yes' if expired else 'No'
            return format_html(
                '<span style="color: {};">{}</span>',
                color, text
            )
        return "Never"
    is_expired.short_description = "Expired"


@admin.register(UserProfile)
class UserProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'company', 'job_title', 'location', 'profile_visibility')
    list_filter = ('profile_visibility', 'created_at')
    search_fields = ('user__email', 'company', 'job_title', 'location')
    autocomplete_fields = ('user',)
    readonly_fields = ('created_at', 'updated_at')
    
    fieldsets = (
        ('User', {
            'fields': ('user',)
        }),
        ('Professional Info', {
            'fields': ('company', 'job_title', 'website', 'location')
        }),
        ('Social Links', {
            'fields': ('linkedin_url', 'twitter_url', 'github_url'),
            'classes': ('collapse',)
        }),
        ('Privacy', {
            'fields': ('profile_visibility',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )


# Unregister the default Group model and register custom Role
admin.site.unregister(Group)

# Customize admin site
admin.site.site_header = "AdTlas Administration"
admin.site.site_title = "AdTlas Admin"
admin.site.index_title = "Welcome to AdTlas Administration"