from django.contrib import admin
from django.utils.html import format_html
from django.urls import reverse
from django.utils.safestring import mark_safe
from django.db.models import Sum, Count
from django.utils import timezone
from django.contrib import messages
from django.utils.translation import ngettext
from .models import Member


@admin.register(Member)
class MemberAdmin(admin.ModelAdmin):
    """Administration avancée pour les membres de la coopérative."""

    list_display = (
        "user_email",
        "user_full_name",
        "role_in_cooperative",
        "membership_duration",
        "membership_fee_status",
        "shares_summary",
        "activity_status",
        "created_at",
    )

    list_filter = (
        "role_in_cooperative",
        "membership_start_date",
        "membership_end_date",
        "is_active",
        "created_at",
        "membership_fee_paid",
    )

    search_fields = (
        "user__email",
        "user__username",
        "user__first_name",
        "user__last_name",
        "phone_number",
        "id_card_number",
    )

    readonly_fields = (
        "id",
        "customer_ptr",
        "total_shares_subscribed",
        "total_shares_paid",
        "membership_duration",
        "shares_summary",
        "created_at",
        "updated_at",
        "view_user_link",
        "view_customer_link",
    )

    fieldsets = (
        (
            "👤 Informations utilisateur",
            {"fields": ("view_user_link", "view_customer_link"), "classes": ("wide",)},
        ),
        (
            "🏢 Adhésion à la coopérative",
            {
                "fields": (
                    "role_in_cooperative",
                    "membership_start_date",
                    "membership_end_date",
                    "membership_duration",
                    "membership_fee_paid",
                ),
                "classes": ("wide",),
            },
        ),
        (
            "📊 Informations sur les parts",
            {
                "fields": (
                    "total_shares_subscribed",
                    "total_shares_paid",
                    "shares_summary",
                ),
                "classes": ("wide",),
            },
        ),
        (
            "🗂️ Métadonnées",
            {
                "fields": (
                    "id",
                    "customer_ptr",
                    "is_active",
                    "created_at",
                    "updated_at",
                    "created_by",
                    "updated_by",
                ),
                "classes": ("collapse",),
            },
        ),
    )

    filter_horizontal = ("identity_documents",)

    date_hierarchy = "membership_start_date"
    actions = ["extend_membership", "update_fees", "deactivate_members"]
    list_per_page = 25

    # Méthodes d'affichage personnalisées
    def user_email(self, obj):
        """Affiche l'email de l'utilisateur avec lien."""
        return format_html(
            '<a href="{}">{}</a>',
            reverse("admin:authentication_user_change", args=[obj.user.pk]),
            obj.user.email,
        )

    user_email.short_description = "📧 Email"
    user_email.admin_order_field = "user__email"

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

    user_full_name.short_description = "👤 Nom complet"
    user_full_name.admin_order_field = "user__last_name"

    def membership_duration(self, obj):
        """Calcule la durée d'adhésion."""
        if obj.membership_start_date:
            end_date = obj.membership_end_date or timezone.now().date()
            duration = end_date - obj.membership_start_date
            years = duration.days // 365
            months = (duration.days % 365) // 30

            if years > 0:
                return f"{years} an{'s' if years > 1 else ''}"
            elif months > 0:
                return f"{months} mois"
            else:
                return f"{duration.days} jours"
        return "Non calculable"

    membership_duration.short_description = "⏱️ Durée adhésion"

    def membership_fee_status(self, obj):
        """Affiche le statut des frais d'adhésion avec couleur."""
        try:
            if obj.membership_fee_paid and obj.membership_fee_paid > 0:
                # Convertir en nombre simple
                fee_amount = int(float(obj.membership_fee_paid))
                html = (
                    '<span style="color: green; font-weight: bold;">💰 {} FCFA</span>'
                )
                return format_html(html, fee_amount)
            return format_html('<span style="color: red;">❌ Impayé</span>')
        except (ValueError, TypeError) as e:
            return format_html('<span style="color: red;">Erreur: {}</span>', str(e))

    membership_fee_status.short_description = "💰 Frais adhésion"

    def shares_summary(self, obj):
        """Résumé des parts souscrites vs payées."""
        try:
            # Récupérer directement les valeurs numériques
            subscribed = (
                int(obj.total_shares_subscribed) if obj.total_shares_subscribed else 0
            )
            paid = int(obj.total_shares_paid) if obj.total_shares_paid else 0

            if subscribed == 0:
                return format_html('<span style="color: gray;">Aucune part</span>')

            percentage = int((paid / subscribed * 100)) if subscribed > 0 else 0

            if percentage == 100:
                color = "green"
            elif percentage > 50:
                color = "orange"
            else:
                color = "red"

            html = '<span style="color: {};">📈 {}/{} ({}%)</span>'
            return format_html(html, color, paid, subscribed, percentage)
        except (ValueError, TypeError, ZeroDivisionError) as e:
            return format_html('<span style="color: red;">Erreur: {}</span>', str(e))

    shares_summary.short_description = "📊 Parts (payées/souscrites)"

    def activity_status(self, obj):
        """Affiche le statut d'activité avec icône."""
        if obj.is_active:
            return format_html('<span style="color: green;">✅ Actif</span>')
        return format_html('<span style="color: red;">❌ Inactif</span>')

    activity_status.short_description = "🔄 Statut"

    def view_user_link(self, obj):
        """Lien vers la page d'administration de l'utilisateur."""
        url = reverse("admin:authentication_user_change", args=[obj.user.pk])
        return format_html(
            '<a href="{}" class="button" target="_blank">👤 Voir l\'utilisateur</a>',
            url,
        )

    view_user_link.short_description = "Utilisateur lié"

    def view_customer_link(self, obj):
        """Lien vers le profil client."""
        url = reverse("admin:customers_customer_change", args=[obj.pk])
        return format_html(
            '<a href="{}" class="button" target="_blank">🛒 Voir le profil client</a>',
            url,
        )

    view_customer_link.short_description = "Profil client"

    # Actions personnalisées
    def extend_membership(self, request, queryset):
        """Prolonge l'adhésion des membres sélectionnés d'un an."""
        updated_count = 0
        for member in queryset:
            if member.membership_end_date:
                member.membership_end_date = timezone.datetime(
                    member.membership_end_date.year + 1,
                    member.membership_end_date.month,
                    member.membership_end_date.day,
                ).date()
            else:
                # Si pas de date de fin, on met dans un an
                member.membership_end_date = (
                    timezone.now().date().replace(year=timezone.now().date().year + 1)
                )
            member.updated_by = request.user
            member.save()
            updated_count += 1

        self.message_user(
            request,
            ngettext(
                "📅 L'adhésion de %d membre a été prolongée d'un an.",
                "📅 L'adhésion de %d membres a été prolongée d'un an.",
                updated_count,
            )
            % updated_count,
            messages.SUCCESS,
        )

    extend_membership.short_description = "📅 Prolonger l'adhésion d'un an"

    def update_fees(self, request, queryset):
        """Marque les frais d'adhésion comme payés."""
        updated = queryset.update(
            membership_fee_paid=100.00, updated_by=request.user  # Montant par défaut
        )
        self.message_user(
            request,
            ngettext(
                "💰 Les frais d'adhésion de %d membre ont été mis à jour.",
                "💰 Les frais d'adhésion de %d membres ont été mis à jour.",
                updated,
            )
            % updated,
            messages.SUCCESS,
        )

    update_fees.short_description = "💰 Marquer frais comme payés"

    def deactivate_members(self, request, queryset):
        """Désactive les membres sélectionnés."""
        updated = queryset.update(is_active=False, updated_by=request.user)
        self.message_user(
            request,
            ngettext(
                "🚫 %d membre a été désactivé.",
                "🚫 %d membres ont été désactivés.",
                updated,
            )
            % updated,
            messages.SUCCESS,
        )

    deactivate_members.short_description = "🚫 Désactiver les membres"

    # Optimisations
    def get_queryset(self, request):
        """Optimise les requêtes avec select_related."""
        return (
            super()
            .get_queryset(request)
            .select_related("user", "created_by", "updated_by")
            .prefetch_related("identity_documents")
        )

    def save_model(self, request, obj, form, change):
        """Définit l'utilisateur qui effectue la modification."""
        if not change:  # Création
            obj.created_by = request.user
        obj.updated_by = request.user
        super().save_model(request, obj, form, change)
