from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin

from apps.accounts.forms import UserChangeForm, UserCreationForm
from apps.accounts.models import LoginEvent, LoginSession, OneTimePassword, User


@admin.register(User)
class UserAdmin(DjangoUserAdmin):
    add_form = UserCreationForm
    form = UserChangeForm
    model = User
    ordering = ("email",)
    list_display = ("email", "full_name", "role", "is_active", "is_email_verified", "two_factor_enabled", "last_login")
    list_filter = ("role", "is_active", "is_email_verified", "two_factor_enabled", "is_staff")
    search_fields = ("email", "first_name", "last_name", "phone")
    fieldsets = (
        (None, {"fields": ("email", "password")}),
        ("Profile", {"fields": ("first_name", "last_name", "phone", "role")}),
        ("Security", {"fields": ("is_email_verified", "is_phone_verified", "two_factor_enabled", "two_factor_secret")}),
        ("Permissions", {"fields": ("is_active", "is_staff", "is_superuser", "groups", "user_permissions")}),
        ("Session", {"fields": ("last_login", "last_login_ip", "last_login_user_agent", "date_joined")}),
    )
    add_fieldsets = (
        (
            None,
            {
                "classes": ("wide",),
                "fields": ("email", "password1", "password2", "role", "first_name", "last_name"),
            },
        ),
    )
    filter_horizontal = ("groups", "user_permissions")
    readonly_fields = ("last_login", "date_joined", "last_login_ip", "last_login_user_agent")


@admin.register(LoginSession)
class LoginSessionAdmin(admin.ModelAdmin):
    list_display = ("user", "ip_address", "device_label", "is_active", "last_seen_at")
    list_filter = ("is_active",)
    search_fields = ("user__email", "ip_address")
    readonly_fields = ("user", "refresh_jti", "ip_address", "user_agent", "device_label", "created_at", "updated_at")


@admin.register(LoginEvent)
class LoginEventAdmin(admin.ModelAdmin):
    list_display = ("email", "status", "ip_address", "created_at")
    list_filter = ("status",)
    search_fields = ("email", "ip_address")
    readonly_fields = [f.name for f in LoginEvent._meta.fields]


@admin.register(OneTimePassword)
class OTPAdmin(admin.ModelAdmin):
    list_display = ("user", "purpose", "expires_at", "consumed_at", "attempt_count")
    list_filter = ("purpose",)
    readonly_fields = [f.name for f in OneTimePassword._meta.fields]
