from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib import admin
from django import forms

from .models import EmailVerificationToken, Occupation, Role, User


class UserAdmin(BaseUserAdmin):
    model = User

    # 🔥 Display columns in list view
    list_display = ('id', 'mobile', 'email', 'referral_code', 'referred_by', 'role', 'is_staff', 'is_active')
    list_filter = ('is_staff', 'is_active', 'role', 'auth_provider')

    # 🔥 Fields shown in admin form
    fieldsets = (
        (None, {'fields': ('mobile', 'email', 'password','login_pin')}),
        ('Personal Info', {'fields': ('first_name', 'last_name', 'date_of_birth', 'occupation')}),
        ('Address', {'fields': ('pincode', 'location')}),
        ('Referral', {'fields': ('referral_code', 'referred_by')}),
        ('Auth & Role', {'fields': ('auth_provider', 'google_id', 'role')}),
        ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
        ('Verification', {'fields': ('is_email_verified', 'is_mobile_verified')}),
        ('Important Dates', {'fields': ('last_login', 'date_joined')}),
    )

    # 🔥 Fields for creating user
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('mobile', 'email', 'password1', 'password2', 'role', 'is_staff', 'is_active', 'occupation'),
        }),
    )

    # 🔥 Replace username with mobile
    ordering = ('mobile',)
    search_fields = ('mobile', 'email', 'referral_code', 'referred_by__mobile', 'referred_by__email')

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        role_field = form.base_fields.get('role')
        if role_field:
            role_choices = [(r.code, r.name) for r in Role.objects.filter(is_active=True).order_by('name')]

            # Preserve current/legacy value in dropdown while roles are being normalized.
            current_role = (obj.role if obj and getattr(obj, 'role', None) else '').strip().upper()
            if current_role and current_role not in {code for code, _ in role_choices}:
                role_choices.insert(0, (current_role, current_role))

            if role_choices:
                role_field.widget = forms.Select(choices=role_choices)
                role_field.help_text = 'Role options are loaded from active Role master records.'
        return form


@admin.register(EmailVerificationToken)
class EmailVerificationTokenAdmin(admin.ModelAdmin):
    list_display = ('id', 'email', 'token', 'expires_at')
    search_fields = ('email', 'token')
    list_filter = ('expires_at',)


@admin.register(Occupation)
class OccupationAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'is_active')
    search_fields = ('name',)
    list_filter = ('is_active',)


@admin.register(Role)
class RoleAdmin(admin.ModelAdmin):
    list_display = ('id', 'code', 'name', 'is_active')
    search_fields = ('code', 'name')
    list_filter = ('is_active',)


admin.site.register(User, UserAdmin)