from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.utils.html import format_html
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from .models import User


@admin.register(User)
class UserAdmin(BaseUserAdmin):
    """Administration personnalisée pour le modèle User."""

    # Affichage de la liste
    list_display = (
        "email",
        "username",
        "full_name",
        "is_active",
        "is_staff",
        "is_superuser",
        "date_joined",
        "last_login",
        "has_customer_profile",
        "has_member_profile",
    )

    list_filter = (
        "is_active",
        "is_staff",
        "is_superuser",
        "date_joined",
        "last_login",
    )

    search_fields = ("email", "username", "first_name", "last_name")

    ordering = ("-date_joined",)

    readonly_fields = (
        "date_joined",
        "last_login",
        "view_customer_link",
        "view_member_link",
    )

    # Configuration des fieldsets pour les formulaires
    fieldsets = (
        (None, {"fields": ("email", "password")}),
        (
            _("Informations personnelles"),
            {"fields": ("username", "first_name", "last_name")},
        ),
        (
            _("Permissions"),
            {
                "fields": (
                    "is_active",
                    "is_staff",
                    "is_superuser",
                    "groups",
                    "user_permissions",
                ),
            },
        ),
        (
            _("Profils liés"),
            {
                "fields": ("view_customer_link", "view_member_link"),
                "classes": ("collapse",),
            },
        ),
        (
            _("Dates importantes"),
            {
                "fields": ("last_login", "date_joined"),
                "classes": ("collapse",),
            },
        ),
    )

    # Fieldsets pour la création d'un nouvel utilisateur
    add_fieldsets = (
        (
            None,
            {
                "classes": ("wide",),
                "fields": (
                    "email",
                    "username",
                    "first_name",
                    "last_name",
                    "password1",
                    "password2",
                ),
            },
        ),
        (
            _("Permissions"),
            {
                "fields": ("is_active", "is_staff", "is_superuser"),
            },
        ),
    )

    filter_horizontal = ("groups", "user_permissions")

    def full_name(self, obj):
        """Affiche le nom complet de l'utilisateur."""
        if obj.first_name and obj.last_name:
            return f"{obj.first_name} {obj.last_name}"
        elif obj.first_name:
            return obj.first_name
        elif obj.last_name:
            return obj.last_name
        else:
            return obj.username or "Nom non défini"

    full_name.short_description = "Nom complet"
    full_name.admin_order_field = "last_name"

    def has_customer_profile(self, obj):
        """Indique si l'utilisateur a un profil client."""
        has_profile = hasattr(obj, "customer")
        if has_profile:
            return format_html('<span style="color: green;">✓ Client</span>')
        return format_html('<span style="color: red;">✗ Pas de profil client</span>')

    has_customer_profile.short_description = "Profil Client"

    def has_member_profile(self, obj):
        """Indique si l'utilisateur a un profil membre."""
        has_customer = hasattr(obj, "customer")
        if has_customer and hasattr(obj.customer, "member"):
            return format_html('<span style="color: green;">✓ Membre</span>')
        return format_html('<span style="color: red;">✗ Pas membre</span>')

    has_member_profile.short_description = "Profil Membre"

    def view_customer_link(self, obj):
        """Lien vers le profil client de l'utilisateur."""
        if hasattr(obj, "customer"):
            url = reverse("admin:customers_customer_change", args=[obj.customer.pk])
            return format_html(
                '<a href="{}" target="_blank">Voir le profil client</a>', url
            )
        return "Aucun profil client"

    view_customer_link.short_description = "Profil Client"

    def view_member_link(self, obj):
        """Lien vers le profil membre de l'utilisateur."""
        if hasattr(obj, "customer") and hasattr(obj.customer, "member"):
            url = reverse("admin:members_member_change", args=[obj.customer.member.pk])
            return format_html(
                '<a href="{}" target="_blank">Voir le profil membre</a>', url
            )
        return "Aucun profil membre"

    view_member_link.short_description = "Profil Membre"

    def get_queryset(self, request):
        """Optimise les requêtes avec select_related."""
        return (
            super()
            .get_queryset(request)
            .select_related("customer")
            .prefetch_related("groups", "user_permissions")
        )

    def save_model(self, request, obj, form, change):
        """Actions à effectuer lors de la sauvegarde."""
        super().save_model(request, obj, form, change)
