# -*- coding: utf-8 -*-
"""
Accounts Admin Configuration

This module configures the Django admin interface for the accounts app,
providing a professional and user-friendly interface for managing users,
roles, and user profiles.

Author: Senior Django Developer
Date: 2024
"""

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import Group
from django.utils.translation import gettext_lazy as _
from django.utils.html import format_html
from django.urls import reverse
from django.utils.safestring import mark_safe
from .models import User, Role, Profile


# Unregister the default Group model since we're using custom Roles
admin.site.unregister(Group)


@admin.register(Role)
class RoleAdmin(admin.ModelAdmin):
    """
    Admin configuration for Role model.
    
    Provides comprehensive management interface for roles including
    permissions management, priority settings, and user assignments.
    """
    
    # List display configuration
    list_display = [
        'name', 
        'priority', 
        'is_active', 
        'permissions_count',
        'users_count',
        'created_at',
        'updated_at'
    ]
    
    # List filters for easy filtering
    list_filter = [
        'is_active',
        'priority',
        'created_at',
        'updated_at'
    ]
    
    # Search functionality
    search_fields = [
        'name',
        'description'
    ]
    
    # Ordering
    ordering = ['-priority', 'name']
    
    # Fields to display in the form
    fieldsets = (
        (_('Basic Information'), {
            'fields': ('name', 'description', 'priority')
        }),
        (_('Status'), {
            'fields': ('is_active',)
        }),
        (_('Permissions'), {
            'fields': ('permissions',),
            'classes': ('wide',)
        }),
        (_('Metadata'), {
            'fields': ('created_at', 'updated_at', 'created_by', 'updated_by'),
            'classes': ('collapse',)
        })
    )
    
    # Read-only fields
    readonly_fields = [
        'created_at', 
        'updated_at', 
        'created_by', 
        'updated_by'
    ]
    
    # Filter for permissions field
    filter_horizontal = ['permissions']
    
    # Actions
    actions = ['activate_roles', 'deactivate_roles']
    
    def permissions_count(self, obj):
        """
        Display the number of permissions assigned to the role.
        
        Args:
            obj: Role instance
            
        Returns:
            str: Formatted count of permissions
        """
        count = obj.permissions.count()
        return format_html(
            '<span style="color: {}">{} permissions</span>',
            'green' if count > 0 else 'red',
            count
        )
    permissions_count.short_description = _('Permissions')
    
    def users_count(self, obj):
        """
        Display the number of users assigned to the role.
        
        Args:
            obj: Role instance
            
        Returns:
            str: Formatted count of users
        """
        count = obj.user_set.count()
        if count > 0:
            url = reverse('admin:accounts_user_changelist') + f'?roles__id__exact={obj.id}'
            return format_html(
                '<a href="{}" style="color: green">{} users</a>',
                url,
                count
            )
        return format_html('<span style="color: red">0 users</span>')
    users_count.short_description = _('Users')
    
    def activate_roles(self, request, queryset):
        """
        Admin action to activate selected roles.
        
        Args:
            request: HTTP request object
            queryset: Selected role objects
        """
        updated = queryset.update(is_active=True)
        self.message_user(
            request,
            _(f'{updated} roles were successfully activated.')
        )
    activate_roles.short_description = _('Activate selected roles')
    
    def deactivate_roles(self, request, queryset):
        """
        Admin action to deactivate selected roles.
        
        Args:
            request: HTTP request object
            queryset: Selected role objects
        """
        updated = queryset.update(is_active=False)
        self.message_user(
            request,
            _(f'{updated} roles were successfully deactivated.')
        )
    deactivate_roles.short_description = _('Deactivate selected roles')


class ProfileInline(admin.StackedInline):
    """
    Inline admin for Profile model.
    
    This allows editing user profile information directly
    from the user admin page.
    """
    model = Profile
    fk_name = 'user'  # Specify the foreign key field name
    can_delete = False
    verbose_name_plural = _('Profile Information')
    
    # Organize fields in fieldsets
    fieldsets = (
        (_('Personal Information'), {
            'fields': ('bio', 'avatar', 'birth_date')
        }),
        (_('Social Links'), {
            'fields': ('website', )
        }),
        (_('Privacy & Notifications'), {
            'fields': ('is_profile_public', 'email_notifications', 'sms_notifications')
        })
    )


# @admin.register(User)
# class UserAdmin(BaseUserAdmin):
#     """
#     Custom admin configuration for User model.
    
#     Extends Django's default UserAdmin to include custom fields
#     and provide better user management interface.
#     """
    
#     # Include the profile inline
#     inlines = [ProfileInline]
    
#     # List display configuration
#     list_display = [
#         'email',
#         'get_full_name',
#         'username',
#         'is_verified',
#         'is_active',
#         'is_staff',
#         'roles_display',
#         'last_login',
#         'date_joined'
#     ]
    
#     # List filters
#     list_filter = [
#         'is_active',
#         'is_staff',
#         'is_superuser',
#         'is_verified',
#         'roles',
#         'date_joined',
#         'last_login'
#     ]
    
#     # Search functionality
#     search_fields = [
#         'email',
#         'username',
#         'first_name',
#         'last_name',
#         'phone_number'
#     ]
    
#     # Ordering
#     ordering = ['-date_joined']
    
#     # Custom fieldsets for the user form
#     fieldsets = (
#         (_('Authentication'), {
#             'fields': ('email', 'username', 'password')
#         }),
#         (_('Personal Information'), {
#             'fields': ('first_name', 'last_name', 'phone_number')
#         }),
#         (_('Permissions'), {
#             'fields': ('is_active', 'is_staff', 'is_superuser', 'roles', 'groups', 'user_permissions'),
#             'classes': ('wide',)
#         }),
#         (_('Account Status'), {
#             'fields': ('is_verified', 'email_verified_at', 'last_login_ip')
#         }),
#         (_('Important Dates'), {
#             'fields': ('last_login', 'date_joined')
#         })
#     )
    
#     # Fieldsets for adding new users
#     add_fieldsets = (
#         (_('Authentication'), {
#             'classes': ('wide',),
#             'fields': ('email', 'username', 'password1', 'password2')
#         }),
#         (_('Personal Information'), {
#             'fields': ('first_name', 'last_name', 'phone_number')
#         }),
#         (_('Permissions'), {
#             'fields': ('is_active', 'is_staff', 'roles')
#         })
#     )
    
#     # Read-only fields
#     readonly_fields = [
#         'last_login',
#         'date_joined',
#         'email_verified_at',
#         'last_login_ip'
#     ]
    
#     # Filter horizontal for many-to-many fields
#     filter_horizontal = ['roles', 'groups', 'user_permissions']
    
#     # Actions
#     actions = [
#         'verify_users',
#         'unverify_users',
#         'activate_users',
#         'deactivate_users'
#     ]
    
#     def roles_display(self, obj):
#         """
#         Display user's roles in a formatted way.
        
#         Args:
#             obj: User instance
            
#         Returns:
#             str: Formatted list of user roles
#         """
#         roles = obj.get_user_roles()
#         if roles:
#             role_links = []
#             for role_name in roles:
#                 try:
#                     role = Role.objects.get(name=role_name)
#                     url = reverse('admin:accounts_role_change', args=[role.id])
#                     role_links.append(f'<a href="{url}">{role_name}</a>')
#                 except Role.DoesNotExist:
#                     role_links.append(role_name)
#             return mark_safe(', '.join(role_links))
#         return format_html('<span style="color: red">No roles</span>')
#     roles_display.short_description = _('Roles')
    
#     def verify_users(self, request, queryset):
#         """
#         Admin action to verify selected users.
        
#         Args:
#             request: HTTP request object
#             queryset: Selected user objects
#         """
#         updated = 0
#         for user in queryset:
#             if not user.is_verified:
#                 user.verify_email()
#                 updated += 1
        
#         self.message_user(
#             request,
#             _(f'{updated} users were successfully verified.')
#         )
#     verify_users.short_description = _('Verify selected users')
    
#     def unverify_users(self, request, queryset):
#         """
#         Admin action to unverify selected users.
        
#         Args:
#             request: HTTP request object
#             queryset: Selected user objects
#         """
#         updated = queryset.update(
#             is_verified=False,
#             email_verified_at=None
#         )
#         self.message_user(
#             request,
#             _(f'{updated} users were successfully unverified.')
#         )
#     unverify_users.short_description = _('Unverify selected users')
    
#     def activate_users(self, request, queryset):
#         """
#         Admin action to activate selected users.
        
#         Args:
#             request: HTTP request object
#             queryset: Selected user objects
#         """
#         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):
#         """
#         Admin action to deactivate selected users.
        
#         Args:
#             request: HTTP request object
#             queryset: Selected user objects
#         """
#         updated = queryset.update(is_active=False)
#         self.message_user(
#             request,
#             _(f'{updated} users were successfully deactivated.')
#         )
#     deactivate_users.short_description = _('Deactivate selected users')


# @admin.register(Profile)
# class ProfileAdmin(admin.ModelAdmin):
#     """
#     Admin configuration for Profile model.
    
#     Provides interface for managing user profiles separately
#     from the main user admin.
#     """
    
#     # List display configuration
#     list_display = [
#         'user', 
#         'birth_date',
#         'is_profile_public',
#         'email_notifications',
#         'sms_notifications',
#         'created_at'
#     ]
    
#     # List filters
#     list_filter = [
#         'is_profile_public',
#         'email_notifications',
#         'sms_notifications',
#         'created_at'
#     ]
    
#     # Search functionality
#     search_fields = [
#         'user__email',
#         'user__first_name',
#         'user__last_name', 
#         'bio'
#     ]
    
#     # Ordering
#     ordering = ['-created_at']
    
#     # Fields organization
#     fieldsets = (
#         (_('User'), {
#             'fields': ('user',)
#         }),
#         (_('Personal Information'), {
#             'fields': ('bio', 'avatar', 'birth_date')
#         }),
#         (_('Social Links'), {
#             'fields': ('website', )
#         }),
#         (_('Privacy & Notifications'), {
#             'fields': ('is_profile_public', 'email_notifications', 'sms_notifications')
#         }),
#         (_('Metadata'), {
#             'fields': ('created_at', 'updated_at'),
#             'classes': ('collapse',)
#         })
#     )
    
#     # Read-only fields
#     readonly_fields = ['created_at', 'updated_at']
    
#     # Raw ID fields for better performance with large datasets
#     raw_id_fields = ['user']

#     # User preferences
#     timezone_field = models.CharField(
#         _('Timezone'),
#         max_length=50,
#         default='UTC',
#         help_text=_('User preferred timezone')
#     )
    
#     language = models.CharField(
#         _('Language'),
#         max_length=10,
#         default='en',
#         choices=[
#             ('en', _('English')),
#             ('es', _('Spanish')),
#             ('fr', _('French')),
#             ('de', _('German')),
#         ],
#         help_text=_('User preferred language')
#     )
