from django import forms
from django.contrib import admin
from django.utils.html import format_html
from django.template.response import TemplateResponse
from django.urls import path, reverse
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import Referencia, ReferenciaImagen

class ReferenciaImagenForm(forms.ModelForm):
    class Meta:
        model = ReferenciaImagen
        fields = ('imagen',)
        widgets = {
            'imagen': forms.FileInput(attrs={'class': 'imagen-input', 'accept': 'image/*'})
        }

class ReferenciaImagenInline(admin.TabularInline):
    model = ReferenciaImagen
    extra = 0
    form = ReferenciaImagenForm
    template = 'admin/referencias/galeria_inline.html'
    
    def has_add_permission(self, request, obj=None):
        return False
    
    class Media:
        css = {
            'all': ('css/galeria_inline.css',)
        }
        js = ('js/galeria_inline.js',)

class ReferenciaAdminForm(forms.ModelForm):
    class Meta:
        model = Referencia
        fields = '__all__'
        widgets = {
            'descripcion': forms.Textarea(attrs={'rows': 3}),
            'stock': forms.NumberInput(attrs={'step': '0.0001', 'min': '0'}),
            'precio_costo': forms.NumberInput(attrs={'step': '0.0001'}),
            'precio_venta_unitario': forms.NumberInput(attrs={'step': '0.01'}),
        }

@admin.register(Referencia)
class ReferenciaAdmin(admin.ModelAdmin):
    form = ReferenciaAdminForm
    inlines = [ReferenciaImagenInline]

    list_display = (
        'sku', 'descripcion_corta', 'tipo', 'clasificacion',
        'grupo', 'subgrupo', 'stock', 'precio_costo',
        'precio_venta_unitario', 'sku_abc', 'activo', 'imagen_miniatura'
    )
    list_filter = ('tipo', 'sku_abc', 'tipo_abastecimiento', 'activo',
                   'clasificacion', 'grupo', 'subgrupo')
    search_fields = ('sku', 'descripcion')
    readonly_fields = ('imagen_miniatura', 'galeria_imagenes')
    list_editable = ('stock', 'precio_venta_unitario')
    save_on_top = True

    fieldsets = (
        ('Información básica', {
            'fields': ('sku', 'descripcion', 'unidad', 'tipo', 'activo')
        }),
        ('Clasificación', {
            'fields': ('clasificacion', 'grupo', 'subgrupo', 'sku_abc')
        }),
        ('Información logística', {
            'fields': (
                'tipo_abastecimiento',
                'stock',
                'precio_costo',
                'precio_venta_unitario',  # ← aquí
            )
        }),
        ('Galería de imágenes', {
            'fields': ('galeria_imagenes',),
        }),
    )
    list_editable = ('stock',)  # Permite editar el stock directamente en la lista
    save_on_top = True
    
    fieldsets = (
        ('Información básica', {
            'fields': ('sku', 'descripcion', 'unidad', 'tipo', 'activo')
        }),
        ('Clasificación', {
            'fields': ('clasificacion', 'grupo', 'subgrupo', 'sku_abc')
        }),
        ('Información logística', {
            'fields': ('tipo_abastecimiento', 'stock', 'precio_venta_unitario')
        }),
        ('Galería de imágenes', {
            'fields': ('galeria_imagenes',),
        }),
    )
    
    def galeria_imagenes(self, obj):
        """Renderiza la galería de imágenes horizontal con botones para agregar/eliminar"""
        if not obj.pk:
            return "Guarde primero la referencia para gestionar imágenes"
        
        html = '<div class="galeria-container">'
        html += '<div class="galeria-imagenes">'
        
        # Mostrar imágenes existentes si estamos editando
        if obj.pk:
            for imagen in obj.imagenes.all():
                html += f'''
                <div class="galeria-item" data-id="{imagen.id}">
                    <div class="galeria-preview">
                        <img src="{imagen.imagen.url}" alt="Imagen de referencia">
                    </div>
                    <div class="galeria-actions">
                        <button type="button" class="eliminar-imagen" data-id="{imagen.id}">
                            <span class="icon">×</span>
                        </button>
                    </div>
                </div>
                '''
        
        html += '''
        <div class="galeria-item galeria-agregar">
            <div class="galeria-drop-area" id="galeria-drop-area">
                <span class="icon">+</span>
                <p>Arrastre imágenes aquí<br>o haga clic para seleccionar</p>
                <input type="file" id="galeria-file-input" accept="image/*" multiple style="display:none">
            </div>
        </div>
        '''
        
        html += '</div>'
        html += f'<input type="hidden" id="referencia-id" value="{obj.id if obj.pk else ""}">'
        html += '</div>'
        
        return format_html(html)
    
    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('<int:referencia_id>/galeria/',
                 self.admin_site.admin_view(self.galeria_view),
                 name='referencia-galeria'),
            path('imagen/upload/',
                 self.admin_site.admin_view(self.upload_imagen),
                 name='referencia-imagen-upload'),
            path('imagen/delete/<int:imagen_id>/',
                 self.admin_site.admin_view(self.delete_imagen),
                 name='referencias_referencia-imagen-delete'),
        ]
        return custom_urls + urls
    
    def galeria_view(self, request, referencia_id):
        """Vista de galería para ver todas las imágenes de una referencia"""
        referencia = Referencia.objects.get(pk=referencia_id)
        context = {
            'title': f'Galería de imágenes para {referencia.sku}',
            'referencia': referencia,
            'imagenes': referencia.imagenes.all(),
            'opts': self.model._meta,
        }
        return TemplateResponse(request, 'admin/referencias/galeria.html', context)
    
    @csrf_exempt
    def upload_imagen(self, request):
        """Endpoint para subir imágenes temporales vía AJAX"""
        if request.method == 'POST' and request.FILES.get('imagen'):
            try:
                # Para referencias existentes
                referencia_id = request.POST.get('referencia_id')
                if referencia_id:
                    referencia = Referencia.objects.get(pk=referencia_id)
                    imagen = ReferenciaImagen(referencia=referencia, imagen=request.FILES['imagen'])
                # Para nuevas referencias (aún no guardadas)
                else:
                    imagen = ReferenciaImagen(imagen=request.FILES['imagen'])
                imagen.save()
                
                return JsonResponse({
                    'success': True,
                    'imagen_id': imagen.id,
                    'imagen_url': imagen.imagen.url,
                })
            except Exception as e:
                return JsonResponse({'success': False, 'error': str(e)})
        return JsonResponse({'success': False, 'error': 'Método no permitido'})
    
    @csrf_exempt
    def delete_imagen(self, request, imagen_id):
        """Endpoint para eliminar imágenes vía AJAX"""
        if request.method == 'POST':
            try:
                imagen = ReferenciaImagen.objects.get(pk=imagen_id)
                imagen.delete()
                return JsonResponse({'success': True})
            except ReferenciaImagen.DoesNotExist:
                return JsonResponse({'success': False, 'error': 'Imagen no encontrada'})
        return JsonResponse({'success': False, 'error': 'Método no permitido'})
    
    def descripcion_corta(self, obj):
        """Muestra una versión corta de la descripción"""
        if len(obj.descripcion) > 50:
            return f"{obj.descripcion[:50]}..."
        return obj.descripcion
    descripcion_corta.short_description = "Descripción"
    
    def imagen_miniatura(self, obj):
        """Muestra la imagen principal en miniatura"""
        if obj.imagen_principal:
            return format_html('<img src="{}" style="height: 50px;" />', obj.imagen_principal.imagen.url)
        return format_html('<span style="color: #999;">Sin imagen</span>')
    imagen_miniatura.short_description = "Imagen"
    
    def save_model(self, request, obj, form, change):
        # Primero guarda la referencia
        super().save_model(request, obj, form, change)
        
        # Asignar imágenes temporales a esta referencia
        ReferenciaImagen.objects.filter(
            referencia__isnull=True
        ).update(referencia=obj)

    def render_change_form(self, request, context, *args, **kwargs):
        # Crear clave de sesión si no existe
        if not request.session.session_key:
            request.session.create()
        return super().render_change_form(request, context, *args, **kwargs)

    class Media:
        css = {
            'all': ('css/referencias_admin.css', 'css/galeria.css')
        }
        js = (
            'admin/js/jquery.init.js',
            'js/referencias_admin.js',
            'js/galeria.js'
        )