from django.contrib import admin
from django import forms
from django.utils.html import format_html
from django.db import models
from .models import Property, PropertyGallery
import admin_thumbnails


class MultipleChoiceWidget(forms.CheckboxSelectMultiple):
    """Widget personalizado para campos múltiples más bonito"""
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.attrs.update({
            'class': 'checkbox-grid',
            'style': 'display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; padding: 10px;'
        })


class PropertyAdminForm(forms.ModelForm):
    """Form personalizado para el modelo Property"""
    
    # Campos personalizados para los JSONField
    features_choices = forms.MultipleChoiceField(
        choices=Property.FEATURES,
        widget=MultipleChoiceWidget,
        required=False,
        label='Características',
        help_text='Selecciona todas las características que apliquen'
    )
    
    services_choices = forms.MultipleChoiceField(
        choices=Property.SERVICES,
        widget=MultipleChoiceWidget,
        required=False,
        label='Servicios Incluidos',
        help_text='Selecciona todos los servicios incluidos'
    )
    
    rules_choices = forms.MultipleChoiceField(
        choices=Property.RULES,
        widget=MultipleChoiceWidget,
        required=False,
        label='Reglas de la Propiedad',
        help_text='Selecciona las reglas que apliquen'
    )

    class Meta:
        model = Property
        fields = '__all__'
        widgets = {
            'description': forms.Textarea(attrs={
                'rows': 4, 
                'cols': 80,
                'style': 'width: 100%; resize: vertical;'
            }),
            'notes': forms.Textarea(attrs={
                'rows': 3, 
                'cols': 80,
                'style': 'width: 100%; resize: vertical;'
            }),
            'address': forms.TextInput(attrs={
                'style': 'width: 100%;',
                'placeholder': 'Ej: Calle 123 #45-67'
            }),
            'maps_url': forms.URLInput(attrs={
                'style': 'width: 100%;',
                'placeholder': 'https://maps.google.com/...'
            }),
            'video_url': forms.URLInput(attrs={
                'style': 'width: 100%;',
                'placeholder': 'https://youtube.com/...'
            }),
            'virtual_tour_url': forms.URLInput(attrs={
                'style': 'width: 100%;',
                'placeholder': 'https://...'
            }),
            'price': forms.NumberInput(attrs={
                'style': 'width: 150px;',
                'step': '10000'
            }),
            'area': forms.NumberInput(attrs={
                'style': 'width: 100px;',
                'min': '1'
            }),
            'bedrooms': forms.NumberInput(attrs={
                'style': 'width: 80px;',
                'min': '0'
            }),
            'bathrooms': forms.NumberInput(attrs={
                'style': 'width: 80px;',
                'min': '1'
            }),
            'floor': forms.NumberInput(attrs={
                'style': 'width: 80px;',
                'min': '0'
            }),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
        # Inicializar los campos de selección múltiple con los valores existentes
        if self.instance.pk:
            self.fields['features_choices'].initial = self.instance.features or []
            self.fields['services_choices'].initial = self.instance.services or []
            self.fields['rules_choices'].initial = self.instance.rules or []
        
        # Mejorar labels y help texts
        self.fields['property_name'].help_text = 'Nombre descriptivo de la propiedad'
        self.fields['slug'].help_text = 'Se genera automáticamente del nombre'
        self.fields['price'].help_text = 'Precio en pesos colombianos'
        self.fields['area'].help_text = 'Área en metros cuadrados'
        self.fields['is_furnished'].help_text = 'Marcar si la propiedad viene amoblada'

    def save(self, commit=True):
        # Guardar los campos de selección múltiple en los JSONField
        instance = super().save(commit=False)
        instance.features = self.cleaned_data.get('features_choices', [])
        instance.services = self.cleaned_data.get('services_choices', [])
        instance.rules = self.cleaned_data.get('rules_choices', [])
        
        if commit:
            instance.save()
        return instance


@admin_thumbnails.thumbnail('image')
class PropertyGalleryInline(admin.TabularInline):
    model = PropertyGallery
    extra = 3
    max_num = 10
    fields = ('image', 'image_thumbnail', 'is_featured', 'order')
    readonly_fields = ('image_thumbnail',)
    verbose_name = "Imagen de la galería"
    verbose_name_plural = "Galería de imágenes"
    
    class Media:
        css = {
            'all': ('admin/css/custom_inline.css',)
        }


@admin.register(Property)
class PropertyAdmin(admin.ModelAdmin):
    form = PropertyAdminForm
    list_display = (
        'property_name', 
        'location', 
        'formatted_price', 
        'area_bedrooms_bathrooms',
        'availability_status',
        'is_available',  
        'purpose',
        'thumbnail_preview'
    )
    list_filter = (
        'is_available',
        'category',
        'purpose',  
        'location',
        'is_furnished',
        'created_date'
    )
    search_fields = ('property_name', 'address', 'description')
    prepopulated_fields = {'slug': ('property_name',)}
    inlines = [PropertyGalleryInline]
    
    readonly_fields = ('thumbnail_preview', 'created_date', 'modified_date')
    list_per_page = 25
    date_hierarchy = 'created_date'
    
    # Organización mejorada de los fieldsets
    fieldsets = (
        ('📋 Información Básica', {
            'fields': (
                'property_name',
                'slug',
                'description',
                'category',
                'purpose',
                'price',
                'main_image',
                'thumbnail_preview',
            ),
            'classes': ('wide',),
        }),
        ('📍 Ubicación', {
            'fields': (
                'location',
                'address',
                'floor',
                'maps_url',
            ),
            'classes': ('wide',),
        }),
        ('🏠 Características Principales', {
            'fields': (
                'area', 
                'bedrooms', 
                'bathrooms',
                'is_furnished',
            ),
            'classes': ('wide',),
        }),
        ('✨ Características Adicionales', {
            'fields': ('features_choices',),
            'classes': ('wide', 'collapse'),
            'description': 'Selecciona las características especiales de la propiedad'
        }),
        ('🛠️ Servicios Incluidos', {
            'fields': ('services_choices',),
            'classes': ('wide', 'collapse'),
            'description': 'Marca todos los servicios que están incluidos en el precio'
        }),
        ('📝 Reglas de la Propiedad', {
            'fields': ('rules_choices',),
            'classes': ('wide', 'collapse'),
            'description': 'Define las reglas y políticas de la propiedad'
        }),
        ('📱 Multimedia', {
            'fields': (
                'video_url',
                'virtual_tour_url',
            ),
            'classes': ('wide', 'collapse'),
        }),
        ('🎯 Estado y Disponibilidad', {
            'fields': (
                ('is_available', 'is_featured', 'is_verified'),
            ),
            'classes': ('wide',),
        }),
        ('📊 Información del Sistema', {
            'fields': (
                ('created_date', 'modified_date'),
                'notes',
            ),
            'classes': ('collapse',),
        }),
    )

    # Métodos personalizados para el list_display
    def formatted_price(self, obj):
        return format_html(
            '<span style="font-weight: bold; color: #28a745;">${}</span>'.format(obj.price)
        )
    formatted_price.short_description = 'Precio'
    formatted_price.admin_order_field = 'price'

    def area_bedrooms_bathrooms(self, obj):
        return format_html(
            '<small>{} m² | {} 🛏️ | {} 🚿</small>',
            obj.area, obj.bedrooms, obj.bathrooms
        )
    area_bedrooms_bathrooms.short_description = 'Detalles'

    def availability_status(self, obj):
        icons = []
        if obj.is_available:
            icons.append('<span style="color: green;">✅ Disponible</span>')
        else:
            icons.append('<span style="color: red;">❌ No disponible</span>')
        
        if obj.is_featured:
            icons.append('<span style="color: gold;">⭐ Destacado</span>')
        
        if obj.is_verified:
            icons.append('<span style="color: blue;">✔️ Verificado</span>')
        
        return format_html('<br>'.join(icons))
    availability_status.short_description = 'Estado'

    def thumbnail_preview(self, obj):
        if obj.main_image:
            return format_html(
                '<img src="{}" style="width: 80px; height: 60px; object-fit: cover; border-radius: 4px; border: 1px solid #ddd;"/>',
                obj.main_image.url
            )
        return format_html('<div style="width: 80px; height: 60px; background: #f0f0f0; border-radius: 4px; display: flex; align-items: center; justify-content: center; font-size: 12px; color: #666;">Sin imagen</div>')
    thumbnail_preview.short_description = 'Vista previa'


    def mark_as_featured(self, request, queryset):
        updated = queryset.update(is_featured=True)
        self.message_user(request, f'{updated} propiedades marcadas como destacadas.')
    mark_as_featured.short_description = "Marcar como destacadas"

    def mark_as_available(self, request, queryset):
        updated = queryset.update(is_available=True)
        self.message_user(request, f'{updated} propiedades marcadas como disponibles.')
    mark_as_available.short_description = "Marcar como disponibles"

    def mark_as_unavailable(self, request, queryset):
        updated = queryset.update(is_available=False)
        self.message_user(request, f'{updated} propiedades marcadas como no disponibles.')
    mark_as_unavailable.short_description = "Marcar como no disponibles"

    class Media:
        css = {
            'all': ('admin/css/property_admin.css',)
        }
        js = ('admin/js/property_admin.js',)


@admin.register(PropertyGallery)
class PropertyGalleryAdmin(admin.ModelAdmin):
    list_display = ('property', 'order', 'is_featured', 'image_preview')
    list_filter = ('is_featured', 'property__location', 'property__category')
    list_editable = ('is_featured', 'order')
    search_fields = ('property__property_name',)
    list_per_page = 30
    readonly_fields = ('image_preview',)
    ordering = ('property', 'order')

    def image_preview(self, obj):
        if obj.image:
            return format_html(
                '<img src="{}" style="width: 60px; height: 45px; object-fit: cover; border-radius: 3px;"/>',
                obj.image.url
            )
        return "-"
    image_preview.short_description = 'Vista previa'

    fieldsets = (
        ('Información de la Imagen', {
            'fields': (
                'property',
                ('image', 'image_preview'),
                ('is_featured', 'order'),
            )
        }),
    )

# Personalización del admin site
admin.site.site_header = "🏠 Administración de Propiedades"
admin.site.site_title = "Admin Propiedades"
admin.site.index_title = "Panel de Control"