import json
from django.contrib import admin
from django import forms
from django.utils.html import format_html
from django.http import JsonResponse
from django.urls import path
from django.template.response import TemplateResponse
from django.db import transaction
from .models import SiteConfiguration, Partner, CarouselSlide, ProgramStatistic, SocialMediaLink, UniversityMapSettings
from traduction.admin_mixins import TranslatableAdminMixin
from config.admin_mixins import OrderableAdminMixin
from config.widgets import LatLongWidget
from cms.admin import ButtonAssignmentInline


class PartnerAdminForm(forms.ModelForm):
    """Formulaire personnalise avec widget carte pour les coordonnees GPS."""

    class Meta:
        model = Partner
        fields = '__all__'
        widgets = {
            'latitude': LatLongWidget(),
            'longitude': LatLongWidget(),
        }


class UniversityMapSettingsForm(forms.ModelForm):
    """Formulaire personnalise avec widget carte pour le centre de la carte."""

    class Meta:
        model = UniversityMapSettings
        fields = '__all__'
        widgets = {
            'center_latitude': LatLongWidget(),
            'center_longitude': LatLongWidget(),
        }


@admin.register(SiteConfiguration)
class SiteConfigurationAdmin(TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['site_name', 'phone', 'email']
    fieldsets = (
        ('Informations generales', {
            'fields': ('site_name', 'tagline', 'phone', 'email', 'address')
        }),
        ('Reseaux sociaux', {
            'fields': ('facebook_url', 'twitter_url', 'linkedin_url', 'youtube_url'),
            'classes': ('collapse',)
        }),
        ('SEO', {
            'fields': ('meta_description', 'meta_keywords'),
            'classes': ('collapse',)
        }),
    )

    def has_add_permission(self, request):
        # Empeche la creation de plusieurs configurations
        return not SiteConfiguration.objects.exists()

    def has_delete_permission(self, request, obj=None):
        return False


@admin.register(Partner)
class PartnerAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    form = PartnerAdminForm
    list_display = ['name', 'is_main_partner', 'is_active', 'order']
    list_editable = ['is_main_partner', 'is_active', 'order']
    list_filter = ['is_main_partner', 'is_active']
    search_fields = ['name']

    fieldsets = (
        ('Informations', {
            'fields': ('name', 'logo', 'description', 'website')
        }),
        ('Localisation', {
            'fields': (('latitude', 'longitude'),),
            'description': 'Cliquez sur "Carte" pour selectionner les coordonnees GPS'
        }),
        ('Statut', {
            'fields': ('is_main_partner', 'is_active', 'order')
        }),
    )


@admin.register(CarouselSlide)
class CarouselSlideAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    change_list_template = 'admin/core/carouselslide/change_list.html'
    list_display = ['slide_preview', 'title', 'buttons_count', 'order', 'is_active']
    list_editable = ['order', 'is_active']
    list_filter = ['is_active']
    search_fields = ['title', 'subtitle']
    inlines = [ButtonAssignmentInline]

    def slide_preview(self, obj):
        """Apercu miniature du slide"""
        if obj.image:
            return format_html(
                '<img src="{}" style="width: 80px; height: 45px; object-fit: cover; border-radius: 4px;" />',
                obj.image.url
            )
        return '-'
    slide_preview.short_description = 'Apercu'

    def buttons_count(self, obj):
        """Compte les boutons"""
        from cms.models import ButtonAssignment
        count = len(ButtonAssignment.get_buttons_for_object(obj, active_only=True))
        return f"{count} bouton(s)"
    buttons_count.short_description = 'Boutons'

    def get_urls(self):
        """Ajoute les URLs pour le reordonnancement."""
        urls = super().get_urls()
        custom_urls = [
            path(
                'reorder/',
                self.admin_site.admin_view(self.reorder_view),
                name='core_carouselslide_reorder'
            ),
            path(
                'visual-reorder/',
                self.admin_site.admin_view(self.visual_reorder_view),
                name='core_carouselslide_visual_reorder'
            ),
        ]
        return custom_urls + urls

    def reorder_view(self, request):
        """Vue HTMX pour sauvegarder l'ordre des slides via drag & drop."""
        if request.method != 'POST':
            return JsonResponse({'success': False, 'error': 'Methode non autorisee'}, status=405)

        try:
            data = json.loads(request.body)
            order_data = data.get('order', [])

            if not order_data:
                return JsonResponse({'success': False, 'error': 'Aucune donnee'})

            with transaction.atomic():
                for item in order_data:
                    CarouselSlide.objects.filter(id=item['id']).update(order=item['order'])

            return JsonResponse({
                'success': True,
                'message': f'{len(order_data)} slide(s) reordonne(s)'
            })

        except json.JSONDecodeError:
            return JsonResponse({'success': False, 'error': 'JSON invalide'}, status=400)
        except Exception as e:
            return JsonResponse({'success': False, 'error': str(e)}, status=500)

    def visual_reorder_view(self, request):
        """Page speciale pour reordonner les slides visuellement."""
        slides = CarouselSlide.objects.all().order_by('order')

        context = {
            **self.admin_site.each_context(request),
            'title': 'Reordonner les slides du carousel',
            'slides': slides,
            'opts': self.model._meta,
            'has_view_permission': self.has_view_permission(request),
        }

        return TemplateResponse(
            request,
            'admin/core/carouselslide/visual_reorder.html',
            context
        )


@admin.register(ProgramStatistic)
class ProgramStatisticAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    change_list_template = 'admin/core/programstatistic/change_list.html'
    list_display = ['label', 'value', 'icon_preview', 'order', 'is_active']
    list_editable = ['value', 'order', 'is_active']
    list_filter = ['is_active']

    def icon_preview(self, obj):
        """Apercu de l'icone"""
        if obj.icon:
            # Si c'est du SVG inline
            if obj.icon.strip().startswith('<svg'):
                return format_html('<span style="display:inline-block;width:24px;height:24px;">{}</span>', obj.icon)
            # Sinon c'est une classe CSS
            return format_html('<i class="{}" style="font-size:20px;"></i>', obj.icon)
        return '-'
    icon_preview.short_description = 'Icone'

    def get_urls(self):
        """Ajoute les URLs pour le reordonnancement."""
        urls = super().get_urls()
        custom_urls = [
            path(
                'reorder/',
                self.admin_site.admin_view(self.reorder_view),
                name='core_programstatistic_reorder'
            ),
            path(
                'visual-reorder/',
                self.admin_site.admin_view(self.visual_reorder_view),
                name='core_programstatistic_visual_reorder'
            ),
        ]
        return custom_urls + urls

    def reorder_view(self, request):
        """Vue HTMX pour sauvegarder l'ordre des statistiques via drag & drop."""
        if request.method != 'POST':
            return JsonResponse({'success': False, 'error': 'Methode non autorisee'}, status=405)

        try:
            data = json.loads(request.body)
            order_data = data.get('order', [])

            if not order_data:
                return JsonResponse({'success': False, 'error': 'Aucune donnee'})

            with transaction.atomic():
                for item in order_data:
                    ProgramStatistic.objects.filter(id=item['id']).update(order=item['order'])

            return JsonResponse({
                'success': True,
                'message': f'{len(order_data)} statistique(s) reordonnee(s)'
            })

        except json.JSONDecodeError:
            return JsonResponse({'success': False, 'error': 'JSON invalide'}, status=400)
        except Exception as e:
            return JsonResponse({'success': False, 'error': str(e)}, status=500)

    def visual_reorder_view(self, request):
        """Page speciale pour reordonner les statistiques visuellement."""
        statistics = ProgramStatistic.objects.all().order_by('order')

        context = {
            **self.admin_site.each_context(request),
            'title': 'Reordonner les statistiques du programme',
            'statistics': statistics,
            'opts': self.model._meta,
            'has_view_permission': self.has_view_permission(request),
        }

        return TemplateResponse(
            request,
            'admin/core/programstatistic/visual_reorder.html',
            context
        )


@admin.register(SocialMediaLink)
class SocialMediaLinkAdmin(OrderableAdminMixin, admin.ModelAdmin):
    list_display = ['platform', 'url', 'is_active', 'order']
    list_editable = ['is_active', 'order']
    list_filter = ['platform', 'is_active']


@admin.register(UniversityMapSettings)
class UniversityMapSettingsAdmin(TranslatableAdminMixin, admin.ModelAdmin):
    form = UniversityMapSettingsForm
    list_display = ['title', 'map_style', 'is_active']
    fieldsets = (
        ('Textes', {
            'fields': ('title', 'subtitle')
        }),
        ('Configuration de la carte', {
            'fields': ('map_style', 'map_height', 'default_zoom', ('center_latitude', 'center_longitude')),
            'description': 'Cliquez sur "Carte" pour selectionner le centre de la carte'
        }),
        ('Couleurs des marqueurs', {
            'fields': (('marker_color', 'coordinator_marker_color'),),
            'classes': ('collapse',)
        }),
        ('Affichage', {
            'fields': ('show_on_home', 'show_on_universities_page', 'is_active')
        }),
    )

    def has_add_permission(self, request):
        # Singleton - empêche la création de plusieurs configurations
        return not UniversityMapSettings.objects.exists()

    def has_delete_permission(self, request, obj=None):
        return False
