import json
from django.contrib import admin
from django import forms
from django.http import JsonResponse
from django.urls import path
from django.db import transaction
from django.template.response import TemplateResponse
from django.utils.html import format_html
from .models import University, UniversityDepartment, UniversityStatistic, IndustrialPartner
from traduction.admin_mixins import TranslatableAdminMixin
from config.admin_mixins import OrderableAdminMixin
from config.widgets import LatLongWidget


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

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


class UniversityDepartmentInline(admin.TabularInline):
    model = UniversityDepartment
    extra = 1


class UniversityStatisticInline(admin.TabularInline):
    model = UniversityStatistic
    extra = 1
    autocomplete_fields = ['stat_type']


@admin.register(University)
class UniversityAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    form = UniversityAdminForm
    change_list_template = 'admin/universities/university/change_list.html'
    list_display = ['logo_preview', 'name', 'country', 'city', 'is_coordinator', 'is_active', 'order']
    list_editable = ['is_coordinator', 'is_active', 'order']
    list_filter = ['country', 'is_coordinator', 'is_active']
    search_fields = ['name', 'city', 'description']
    prepopulated_fields = {'slug': ('name',)}
    inlines = [UniversityDepartmentInline, UniversityStatisticInline]

    fieldsets = (
        ('Informations generales', {
            'fields': ('name', 'slug', 'abbreviation', 'country', 'city', 'address', ('latitude', 'longitude'))
        }),
        ('Media', {
            'fields': ('logo', 'image')
        }),
        ('Description', {
            'fields': ('description', 'short_description')
        }),
        ('Contact', {
            'fields': ('website', 'email', 'phone')
        }),
        ('Informations supplementaires', {
            'fields': ('founded_year', 'ranking_position', 'color'),
            'classes': ('collapse',)
        }),
        ('Statut', {
            'fields': ('is_coordinator', 'is_active', 'order')
        }),
    )

    def logo_preview(self, obj):
        """Apercu miniature du logo"""
        if obj.logo:
            return format_html(
                '<img src="{}" style="width: 40px; height: 40px; object-fit: contain; border-radius: 4px; background: #f5f5f5; padding: 2px;" />',
                obj.logo.url
            )
        return '-'
    logo_preview.short_description = 'Logo'

    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='universities_university_reorder'
            ),
            path(
                'visual-reorder/',
                self.admin_site.admin_view(self.visual_reorder_view),
                name='universities_university_visual_reorder'
            ),
        ]
        return custom_urls + urls

    def reorder_view(self, request):
        """Vue HTMX pour sauvegarder l'ordre des universites 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:
                    University.objects.filter(id=item['id']).update(order=item['order'])

            return JsonResponse({
                'success': True,
                'message': f'{len(order_data)} universite(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 universites visuellement."""
        universities = University.objects.all().order_by('order')

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

        return TemplateResponse(
            request,
            'admin/universities/university/visual_reorder.html',
            context
        )


@admin.register(UniversityDepartment)
class UniversityDepartmentAdmin(TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['name', 'university', 'specialization']
    list_filter = ['university']
    search_fields = ['name', 'specialization']


@admin.register(UniversityStatistic)
class UniversityStatisticAdmin(admin.ModelAdmin):
    list_display = ['university', 'stat_type', 'value', 'year']
    list_filter = ['university', 'stat_type', 'year']
    list_select_related = ['university', 'stat_type']
    autocomplete_fields = ['stat_type', 'university']


@admin.register(IndustrialPartner)
class IndustrialPartnerAdmin(OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    change_list_template = 'admin/universities/industrialpartner/change_list.html'
    list_display = ['logo_preview', 'name', 'universities_count', 'is_active', 'order']
    list_editable = ['is_active', 'order']
    list_filter = ['is_active', 'universities']
    search_fields = ['name']
    filter_horizontal = ['universities']

    def logo_preview(self, obj):
        """Apercu miniature du logo"""
        if obj.logo:
            return format_html(
                '<img src="{}" style="width: 40px; height: 40px; object-fit: contain; border-radius: 4px; background: #f5f5f5; padding: 2px;" />',
                obj.logo.url
            )
        return '-'
    logo_preview.short_description = 'Logo'

    def universities_count(self, obj):
        """Nombre d'universites partenaires"""
        count = obj.universities.count()
        return f"{count} univ."
    universities_count.short_description = 'Universites'

    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='universities_industrialpartner_reorder'
            ),
            path(
                'visual-reorder/',
                self.admin_site.admin_view(self.visual_reorder_view),
                name='universities_industrialpartner_visual_reorder'
            ),
        ]
        return custom_urls + urls

    def reorder_view(self, request):
        """Vue HTMX pour sauvegarder l'ordre des partenaires 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:
                    IndustrialPartner.objects.filter(id=item['id']).update(order=item['order'])

            return JsonResponse({
                'success': True,
                'message': f'{len(order_data)} partenaire(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 partenaires visuellement."""
        partners = IndustrialPartner.objects.all().order_by('order').prefetch_related('universities')

        context = {
            **self.admin_site.each_context(request),
            'title': 'Reordonner les partenaires industriels',
            'partners': partners,
            'opts': self.model._meta,
            'has_view_permission': self.has_view_permission(request),
        }

        return TemplateResponse(
            request,
            'admin/universities/industrialpartner/visual_reorder.html',
            context
        )
