"""
Configuration admin pour le CMS.
"""
from django.contrib import admin
from django.contrib.contenttypes.admin import GenericTabularInline
from django.utils.html import format_html
from django.utils.safestring import mark_safe

from django.urls import reverse

from traduction.admin_mixins import TranslatableAdminMixin
from config.admin_mixins import OrderableAdminMixin, IconPickerAdminMixin, IconPickerInlineMixin
from .models import (
    Template, TemplateFile, Section, Page, PageSection,
    Menu, MenuItem, SettingType, Setting, Keyword, KeywordAssignment,
    SectionField, PageSectionFieldValue, Button, ButtonAssignment
)


# =============================================================================
# Inlines
# =============================================================================

class PageSectionInline(admin.TabularInline):
    """Inline pour les sections d'une page avec ordre."""
    model = PageSection
    extra = 1
    ordering = ['order']
    autocomplete_fields = ['section']
    verbose_name = "Section"
    verbose_name_plural = "Sections de la page"
    fields = ['order', 'section', 'section_info', 'edit_fields_link', 'edit_pagesection_link']
    readonly_fields = ['section_info', 'edit_fields_link', 'edit_pagesection_link']
    show_change_link = False

    class Media:
        css = {
            'all': ['admin/cms/css/sortable.css']
        }
        js = [
            'https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js',
            'admin/cms/js/inline_sortable.js',
        ]

    def section_info(self, obj):
        """Affiche les informations de la section."""
        if obj.pk and obj.section:
            fields_count = obj.section.custom_fields.count()
            file_html = f'<code style="font-size: 10px; background: #f5f5f5; padding: 2px 6px; border-radius: 3px;">{obj.section.file}.html</code>' if obj.section.file else ''
            fields_badge = ''
            if fields_count > 0:
                fields_badge = f'<span style="margin-left: 8px; padding: 2px 6px; background: #9c27b0; color: white; border-radius: 10px; font-size: 10px;">{fields_count} champs</span>'
            return mark_safe(f'{file_html} {fields_badge}')
        return '-'
    section_info.short_description = 'Info'

    def edit_fields_link(self, obj):
        """Affiche un lien pour editer les champs personnalises."""
        if obj.pk and obj.section.custom_fields.exists():
            url = reverse('cms:edit_pagesection_fields', args=[obj.pk])
            count = obj.field_values.count()
            total = obj.section.custom_fields.count()
            color = '#28a745' if count == total else '#ffc107' if count > 0 else '#9c27b0'
            return format_html(
                '<a href="{}" class="button" style="padding: 4px 12px; background: {}; '
                'color: white; border-radius: 4px; text-decoration: none; font-size: 11px;">'
                '&#9998; Champs ({}/{})</a>',
                url, color, count, total
            )
        elif obj.pk:
            return format_html(
                '<span style="color: #999; font-size: 11px;">-</span>'
            )
        return '-'
    edit_fields_link.short_description = 'Champs'

    def edit_pagesection_link(self, obj):
        """Affiche un lien pour editer le PageSection directement."""
        if obj.pk:
            url = reverse('admin:cms_pagesection_change', args=[obj.pk])
            return format_html(
                '<a href="{}" class="button" style="padding: 4px 12px; background: #417690; '
                'color: white; border-radius: 4px; text-decoration: none; font-size: 11px;">'
                '&#9881; Editer</a>',
                url
            )
        return '-'
    edit_pagesection_link.short_description = 'PageSection'


class MenuItemInline(IconPickerInlineMixin, admin.TabularInline):
    """Inline pour les elements de menu avec ordre par fratrie (parent puis ordre)."""
    model = MenuItem
    fk_name = 'menu'
    extra = 1
    ordering = ['parent__order', 'parent__id', 'order']  # Ordre par parent puis par ordre dans la fratrie
    fields = [
        'order', 'title', 'parent', 'url_type',
        'internal_url', 'external_url', 'page', 'icon',
        'open_in_new_tab', 'active'
    ]
    autocomplete_fields = ['parent', 'page']
    verbose_name = "Element"
    verbose_name_plural = "Elements du menu"

    class Media:
        css = {
            'all': ['admin/cms/css/sortable.css']
        }
        js = [
            'https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js',
            'admin/cms/js/inline_sortable.js',
        ]


class SectionInline(admin.TabularInline):
    """Inline pour les sections d'un template."""
    model = Section
    extra = 0
    show_change_link = True
    fields = ['name', 'file', 'title']
    readonly_fields = ['name', 'file']


class TemplateFileInline(admin.TabularInline):
    """Inline pour les fichiers supplementaires d'un template."""
    model = TemplateFile
    extra = 1
    fields = ['name', 'file', 'description']
    show_change_link = True


class KeywordAssignmentInline(GenericTabularInline):
    """Inline generique pour associer des mots-cles a n'importe quel modele."""
    model = KeywordAssignment
    extra = 1
    autocomplete_fields = ['keyword']
    verbose_name = "Mot-cle"
    verbose_name_plural = "Mots-cles"


class SectionFieldInline(admin.TabularInline):
    """Inline pour definir les champs personnalises d'une Section."""
    model = SectionField
    extra = 0
    ordering = ['order']
    fields = ['order', 'name', 'label', 'field_type', 'required', 'default_value', 'help_text', 'choices']
    verbose_name = "Champ personnalise"
    verbose_name_plural = "Champs personnalises"

    class Media:
        css = {
            'all': ['admin/cms/css/sortable.css']
        }
        js = [
            'https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js',
            'admin/cms/js/inline_sortable.js',
        ]


# =============================================================================
# Template Admin
# =============================================================================

@admin.register(Template)
class TemplateAdmin(admin.ModelAdmin):
    list_display = ['name', 'template_dir_status', 'base_file', 'active', 'file_count', 'section_count', 'created_at']
    list_filter = ['active']
    search_fields = ['name', 'template_dir']
    prepopulated_fields = {'slug': ('name',)}
    inlines = [TemplateFileInline, SectionInline]

    fieldsets = (
        (None, {
            'fields': ('name', 'slug', 'template_dir', 'base_file', 'description')
        }),
        ('Statut', {
            'fields': ('active',)
        }),
    )

    def template_dir_status(self, obj):
        """Affiche le repertoire avec indicateur d'existence."""
        import os
        exists = os.path.exists(obj.get_base_path())
        if exists:
            return format_html(
                '<span style="color: #28a745;">&#10003;</span> {}',
                obj.template_dir
            )
        return format_html(
            '<span style="color: #dc3545;">&#10007;</span> {}',
            obj.template_dir
        )
    template_dir_status.short_description = 'Repertoire'

    def file_count(self, obj):
        count = obj.files.count()
        if count:
            return format_html(
                '<span style="padding: 3px 8px; background: #6c757d; color: white; '
                'border-radius: 10px;">{}</span>',
                count
            )
        return '-'
    file_count.short_description = 'Fichiers'

    def section_count(self, obj):
        count = obj.sections.count()
        return format_html(
            '<span style="padding: 3px 8px; background: #17a2b8; color: white; '
            'border-radius: 10px;">{}</span>',
            count
        )
    section_count.short_description = 'Sections'


# =============================================================================
# TemplateFile Admin
# =============================================================================

@admin.register(TemplateFile)
class TemplateFileAdmin(admin.ModelAdmin):
    list_display = ['name', 'template', 'file_status', 'created_at']
    list_filter = ['template']
    search_fields = ['name', 'file', 'template__name']  # Pour autocomplete
    autocomplete_fields = ['template']
    ordering = ['template', 'name']

    fieldsets = (
        (None, {
            'fields': ('template', 'name', 'file', 'description')
        }),
    )

    def file_status(self, obj):
        """Affiche le nom du fichier avec un indicateur de statut."""
        if obj.file_exists():
            return format_html(
                '<span style="color: #28a745;">&#10003;</span> {}.html',
                obj.file
            )
        return format_html(
            '<span style="color: #dc3545;">&#10007;</span> {}.html',
            obj.file
        )
    file_status.short_description = 'Fichier'


# =============================================================================
# Section Admin
# =============================================================================

@admin.register(Section)
class SectionAdmin(TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['name', 'template', 'file_status', 'title', 'custom_fields_count', 'image_preview']
    list_filter = ['template']
    search_fields = ['name', 'title', 'file']
    autocomplete_fields = ['template']
    inlines = [SectionFieldInline]

    fieldsets = (
        (None, {
            'fields': ('name', 'template', 'file')
        }),
        ('Contenu', {
            'fields': ('title', 'description', 'image')
        }),
    )

    def custom_fields_count(self, obj):
        """Affiche le nombre de champs personnalises."""
        count = obj.custom_fields.count()
        if count:
            return format_html(
                '<span style="padding: 3px 8px; background: #9c27b0; color: white; '
                'border-radius: 10px;">{}</span>',
                count
            )
        return '-'
    custom_fields_count.short_description = 'Champs'

    def file_status(self, obj):
        """Affiche le nom du fichier avec un indicateur de statut."""
        if obj.file_exists():
            return format_html(
                '<span style="color: #28a745;">&#10003;</span> {}.html',
                obj.file
            )
        return format_html(
            '<span style="color: #dc3545;">&#10007;</span> {}.html',
            obj.file
        )
    file_status.short_description = 'Fichier'

    def image_preview(self, obj):
        if obj.image:
            return format_html(
                '<img src="{}" style="max-height: 40px; max-width: 60px;" />',
                obj.image.url
            )
        return '-'
    image_preview.short_description = 'Image'


# =============================================================================
# Page Admin
# =============================================================================

@admin.register(Page)
class PageAdmin(TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['name', 'slug', 'template', 'template_file_display', 'is_active', 'is_homepage', 'section_count', 'reorder_link']
    list_filter = ['is_active', 'is_homepage', 'template']
    search_fields = ['name', 'title', 'slug']
    prepopulated_fields = {'slug': ('name',)}
    autocomplete_fields = ['template', 'template_file']
    inlines = [PageSectionInline]
    change_form_template = 'admin/cms/page_change_form.html'

    fieldsets = (
        (None, {
            'fields': ('name', 'slug', 'template', 'template_file')
        }),
        ('Contenu', {
            'fields': ('title', 'description', 'keywords_text')
        }),
        ('Statut', {
            'fields': ('is_active', 'is_homepage')
        }),
    )

    def template_file_display(self, obj):
        if obj.template_file:
            return f"{obj.template_file.file}.html"
        return f"{obj.template.base_file}"
    template_file_display.short_description = 'Fichier'

    def section_count(self, obj):
        count = obj.sections.count()
        return format_html(
            '<span style="padding: 3px 8px; background: #667eea; color: white; '
            'border-radius: 10px;">{}</span>',
            count
        )
    section_count.short_description = 'Sections'

    def reorder_link(self, obj):
        from django.urls import reverse
        url = reverse('cms:reorder_sections_view', args=[obj.pk])
        return format_html(
            '<a href="{}" class="button" style="padding: 4px 12px; background: #417690; '
            'color: white; border-radius: 4px; text-decoration: none; font-size: 11px;">'
            '&#9776; Ordonner</a>',
            url
        )
    reorder_link.short_description = 'Ordre'


# =============================================================================
# PageSection Admin
# =============================================================================

class PageSectionFieldValueInline(admin.TabularInline):
    """Inline pour editer les valeurs des champs personnalises."""
    model = PageSectionFieldValue
    extra = 0
    fields = ['field', 'field_type_display', 'text_value', 'integer_value', 'decimal_value', 'boolean_value', 'image_value']
    readonly_fields = ['field', 'field_type_display']

    def field_type_display(self, obj):
        """Affiche le type de champ."""
        if obj.field:
            return obj.field.get_field_type_display()
        return '-'
    field_type_display.short_description = 'Type'

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

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


@admin.register(PageSection)
class PageSectionAdmin(OrderableAdminMixin, admin.ModelAdmin):
    list_display = ['page', 'section', 'order', 'fields_status', 'edit_fields_link']
    list_filter = ['page', 'section', 'page__template']
    list_editable = ['order']
    search_fields = ['page__name', 'section__name']
    autocomplete_fields = ['page', 'section']
    ordering = ['page', 'order']
    inlines = [PageSectionFieldValueInline]

    fieldsets = (
        (None, {
            'fields': ('page', 'section', 'order')
        }),
    )

    def changelist_view(self, request, extra_context=None):
        """Redirige vers le gestionnaire de sections par page."""
        from django.http import HttpResponseRedirect
        # Si on veut voir la liste classique, ajouter ?classic=1 a l'URL
        if request.GET.get('classic'):
            return super().changelist_view(request, extra_context)
        return HttpResponseRedirect(reverse('cms:pagesection_manager'))

    def fields_status(self, obj):
        """Affiche le nombre de champs remplis / total."""
        total = obj.section.custom_fields.count()
        if total == 0:
            return format_html(
                '<span style="color: #999; font-size: 11px;">Aucun champ</span>'
            )
        filled = obj.field_values.count()
        color = '#28a745' if filled == total else '#ffc107' if filled > 0 else '#dc3545'
        return format_html(
            '<span style="padding: 3px 8px; background: {}; color: white; '
            'border-radius: 10px; font-size: 11px;">{}/{}</span>',
            color, filled, total
        )
    fields_status.short_description = 'Champs'

    def edit_fields_link(self, obj):
        """Affiche un lien pour editer les champs personnalises."""
        if obj.pk and obj.section.custom_fields.exists():
            url = reverse('cms:edit_pagesection_fields', args=[obj.pk])
            return format_html(
                '<a href="{}" class="button" style="padding: 4px 12px; background: #9c27b0; '
                'color: white; border-radius: 4px; text-decoration: none; font-size: 11px;">'
                '&#9998; Editer</a>',
                url
            )
        return '-'
    edit_fields_link.short_description = 'Actions'

    def save_model(self, request, obj, form, change):
        """Cree les PageSectionFieldValue manquants apres la sauvegarde."""
        super().save_model(request, obj, form, change)
        # Creer les valeurs de champs manquantes
        for field in obj.section.custom_fields.all():
            PageSectionFieldValue.objects.get_or_create(
                page_section=obj,
                field=field
            )


# =============================================================================
# Menu Admin
# =============================================================================

@admin.register(Menu)
class MenuAdmin(admin.ModelAdmin):
    list_display = ['name', 'slug', 'location', 'active', 'item_count', 'reorder_link']
    list_filter = ['location', 'active']
    search_fields = ['name']
    prepopulated_fields = {'slug': ('name',)}
    inlines = [MenuItemInline]

    fieldsets = (
        (None, {
            'fields': ('name', 'slug', 'location')
        }),
        ('Statut', {
            'fields': ('active',)
        }),
    )

    def item_count(self, obj):
        count = obj.items.count()
        return format_html(
            '<span style="padding: 3px 8px; background: #28a745; color: white; '
            'border-radius: 10px;">{}</span>',
            count
        )
    item_count.short_description = 'Elements'

    def reorder_link(self, obj):
        from django.urls import reverse
        url = reverse('cms:reorder_menu_items_view', args=[obj.pk])
        return format_html(
            '<a href="{}" class="button" style="padding: 4px 12px; background: #28a745; '
            'color: white; border-radius: 4px; text-decoration: none; font-size: 11px;">'
            '&#9776; Ordonner</a>',
            url
        )
    reorder_link.short_description = 'Ordre'


# =============================================================================
# MenuItem Admin
# =============================================================================

@admin.register(MenuItem)
class MenuItemAdmin(IconPickerAdminMixin, OrderableAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['title', 'menu', 'parent', 'url_type', 'get_url_display', 'order', 'active']
    list_filter = ['menu', 'url_type', 'active', 'parent']
    search_fields = ['title', 'internal_url', 'external_url']
    list_editable = ['order', 'active']
    autocomplete_fields = ['menu', 'parent', 'page']
    ordering = ['menu', 'parent__order', 'parent__id', 'order']  # Ordre par menu, puis parent, puis ordre dans la fratrie

    fieldsets = (
        (None, {
            'fields': ('menu', 'parent', 'title')
        }),
        ('URL', {
            'fields': ('url_type', 'internal_url', 'external_url', 'page')
        }),
        ('Options', {
            'fields': ('icon', 'open_in_new_tab', 'order', 'active')
        }),
    )

    def get_url_display(self, obj):
        url = obj.get_url()
        if url and url != '#':
            return format_html(
                '<a href="{}" target="_blank" style="color: #667eea;">{}</a>',
                url,
                url[:40] + '...' if len(url) > 40 else url
            )
        return '-'
    get_url_display.short_description = 'URL'


# =============================================================================
# SettingType Admin
# =============================================================================

@admin.register(SettingType)
class SettingTypeAdmin(admin.ModelAdmin):
    list_display = ['name', 'slug', 'value_type_display', 'icon_display', 'settings_count', 'example_output']
    list_filter = ['value_type']
    search_fields = ['name', 'slug', 'description']
    prepopulated_fields = {'slug': ('name',)}
    ordering = ['name']

    fieldsets = (
        (None, {
            'fields': ('name', 'slug', 'value_type', 'icon', 'description')
        }),
        ('Formatage', {
            'fields': ('format_pattern',),
            'description': 'Pattern HTML avec {value} comme placeholder. '
                          'Laissez vide pour utiliser le pattern par defaut du type.'
        }),
    )

    def value_type_display(self, obj):
        """Affiche le type avec une couleur."""
        colors = {
            'text': '#6c757d',
            'textarea': '#6c757d',
            'number': '#007bff',
            'decimal': '#007bff',
            'phone': '#28a745',
            'email': '#17a2b8',
            'url': '#6f42c1',
            'currency': '#ffc107',
            'percentage': '#fd7e14',
            'color': '#e83e8c',
            'boolean': '#20c997',
            'image': '#dc3545',
        }
        color = colors.get(obj.value_type, '#6c757d')
        return format_html(
            '<span style="padding: 3px 8px; background: {}; color: white; '
            'border-radius: 4px; font-size: 11px;">{}</span>',
            color, obj.get_value_type_display()
        )
    value_type_display.short_description = 'Type'

    def icon_display(self, obj):
        """Affiche l'icone si definie."""
        if obj.icon:
            return format_html('<i class="fa {}"></i> {}', obj.icon, obj.icon)
        return '-'
    icon_display.short_description = 'Icone'

    def settings_count(self, obj):
        """Affiche le nombre de parametres utilisant ce type."""
        count = obj.settings.count()
        if count:
            return format_html(
                '<span style="padding: 3px 8px; background: #6c757d; color: white; '
                'border-radius: 10px;">{}</span>',
                count
            )
        return '-'
    settings_count.short_description = 'Utilisations'

    def example_output(self, obj):
        """Affiche un exemple du formatage."""
        pattern = obj.get_pattern()
        if pattern and pattern != '{value}':
            examples = {
                'phone': '+33 1 23 45 67 89',
                'email': 'contact@example.com',
                'url': 'https://example.com',
                'currency': '100',
                'percentage': '50',
                'color': '#FF5733',
                'boolean': 'true',
                'number': '42',
                'decimal': '12.50',
                'image': '/media/logo.png',
            }
            example_value = examples.get(obj.value_type, 'Exemple')
            return format_html('<code style="font-size: 11px;">{}</code>', obj.format_value(example_value))
        return '-'
    example_output.short_description = 'Apercu'


# =============================================================================
# Setting Admin
# =============================================================================

@admin.register(Setting)
class SettingAdmin(TranslatableAdminMixin, OrderableAdminMixin, admin.ModelAdmin):
    list_display = ['name', 'slug', 'category_display', 'type_display', 'value_preview', 'image_preview', 'is_active', 'order']
    list_filter = ['category', 'type', 'is_active', 'is_required']
    list_editable = ['is_active', 'order']
    search_fields = ['name', 'slug', 'value', 'description']
    prepopulated_fields = {'slug': ('name',)}
    ordering = ['category', 'order', 'name']

    fieldsets = (
        (None, {
            'fields': ('name', 'slug', 'type', 'category', 'description')
        }),
        ('Valeur', {
            'fields': ('value', 'image'),
            'description': 'Renseignez la valeur selon le type choisi. '
                           'Pour les images, utilisez le champ image.'
        }),
        ('Options', {
            'fields': ('is_required', 'is_active', 'order'),
            'classes': ('collapse',)
        }),
    )

    def category_display(self, obj):
        """Affiche la categorie avec une couleur."""
        colors = {
            'general': '#6c757d',
            'contact': '#28a745',
            'social': '#007bff',
            'seo': '#6f42c1',
            'appearance': '#e83e8c',
            'other': '#adb5bd',
        }
        color = colors.get(obj.category, '#6c757d')
        return format_html(
            '<span style="padding: 2px 6px; background: {}; color: white; '
            'border-radius: 3px; font-size: 10px;">{}</span>',
            color, obj.get_category_display()
        )
    category_display.short_description = 'Categorie'

    def type_display(self, obj):
        """Affiche le type avec l'icone."""
        if obj.type:
            if obj.type.icon:
                return format_html(
                    '<i class="fa {}"></i> {}',
                    obj.type.icon, obj.type.name
                )
            return obj.type.name
        return '-'
    type_display.short_description = 'Type'

    def value_preview(self, obj):
        """Affiche un apercu de la valeur."""
        if obj.value:
            # Pour les couleurs, afficher un carre colore
            if obj.value_type == 'color':
                return format_html(
                    '<span style="background-color:{}; width:20px; height:20px; '
                    'display:inline-block; border-radius:3px; vertical-align:middle;"></span> {}',
                    obj.value, obj.value
                )
            # Pour les booleens, afficher une icone
            if obj.value_type == 'boolean':
                is_true = obj.value.lower() in ('true', '1', 'yes', 'oui')
                icon = '&#10003;' if is_true else '&#10007;'
                color = '#28a745' if is_true else '#dc3545'
                return format_html(
                    '<span style="color: {}; font-size: 16px;">{}</span>',
                    color, icon
                )
            # Pour les autres types, tronquer
            preview = obj.value[:40]
            if len(obj.value) > 40:
                preview += '...'
            return preview
        return '-'
    value_preview.short_description = 'Valeur'

    def image_preview(self, obj):
        """Affiche l'apercu de l'image."""
        if obj.image:
            return format_html(
                '<img src="{}" style="max-height: 40px; max-width: 60px; object-fit: contain;" />',
                obj.image.url
            )
        return '-'
    image_preview.short_description = 'Image'


# =============================================================================
# Keyword Admin
# =============================================================================

class KeywordAssignmentInlineForKeyword(admin.TabularInline):
    """Inline pour voir les associations d'un mot-cle."""
    model = KeywordAssignment
    extra = 0
    readonly_fields = ['content_type', 'object_id', 'content_object_display']
    can_delete = True

    def content_object_display(self, obj):
        if obj.content_object:
            return str(obj.content_object)
        return '-'
    content_object_display.short_description = 'Objet'


@admin.register(Keyword)
class KeywordAdmin(admin.ModelAdmin):
    list_display = ['name', 'slug', 'usage_count', 'created_at']
    search_fields = ['name', 'slug']
    prepopulated_fields = {'slug': ('name',)}
    inlines = [KeywordAssignmentInlineForKeyword]

    fieldsets = (
        (None, {
            'fields': ('name', 'slug', 'description')
        }),
    )

    def usage_count(self, obj):
        count = obj.get_usage_count()
        return format_html(
            '<span style="padding: 3px 8px; background: #6c757d; color: white; '
            'border-radius: 10px;">{}</span>',
            count
        )
    usage_count.short_description = 'Utilisations'


@admin.register(KeywordAssignment)
class KeywordAssignmentAdmin(admin.ModelAdmin):
    list_display = ['keyword', 'content_type', 'object_id', 'content_object_display', 'created_at']
    list_filter = ['content_type', 'keyword']
    search_fields = ['keyword__name']
    autocomplete_fields = ['keyword']
    readonly_fields = ['content_object_display']

    fieldsets = (
        (None, {
            'fields': ('keyword',)
        }),
        ('Objet associe', {
            'fields': ('content_type', 'object_id', 'content_object_display')
        }),
    )

    def content_object_display(self, obj):
        if obj.content_object:
            return str(obj.content_object)
        return '-'
    content_object_display.short_description = 'Objet'


# =============================================================================
# Button Admin
# =============================================================================

class ButtonAssignmentInlineForButton(admin.TabularInline):
    """Inline pour voir les associations d'un bouton."""
    model = ButtonAssignment
    extra = 0
    readonly_fields = ['content_type', 'object_id', 'content_object_display']
    fields = ['content_type', 'object_id', 'content_object_display', 'order']
    can_delete = True

    def content_object_display(self, obj):
        if obj.content_object:
            return str(obj.content_object)
        return '-'
    content_object_display.short_description = 'Objet'


class ButtonAssignmentInline(GenericTabularInline):
    """Inline generique pour associer des boutons a n'importe quel modele."""
    model = ButtonAssignment
    extra = 1
    autocomplete_fields = ['button']
    verbose_name = "Bouton"
    verbose_name_plural = "Boutons"
    fields = ['button', 'order']
    ordering = ['order']


@admin.register(Button)
class ButtonAdmin(IconPickerAdminMixin, TranslatableAdminMixin, admin.ModelAdmin):
    list_display = ['name', 'text', 'style_preview', 'link_type', 'url_preview', 'usage_count', 'active']
    list_filter = ['style', 'link_type', 'active']
    list_editable = ['active']
    search_fields = ['name', 'text', 'external_url', 'named_url']
    autocomplete_fields = ['internal_page']
    inlines = [ButtonAssignmentInlineForButton]

    fieldsets = (
        (None, {
            'fields': ('name', 'text', 'style', 'icon', 'active')
        }),
        ('Lien', {
            'fields': ('link_type', 'external_url', 'internal_page', 'named_url', 'open_in_new_tab'),
            'description': 'Choisissez le type de lien et renseignez le champ correspondant.'
        }),
    )

    def style_preview(self, obj):
        """Affiche un apercu du style."""
        colors = {
            'primary': '#f59e0b',
            'secondary': '#ffffff',
            'outline': 'transparent',
            'dark': '#1f2937',
            'gradient': 'linear-gradient(to right, #3b82f6, #8b5cf6)',
            'ghost': 'transparent',
            'success': '#10b981',
            'danger': '#ef4444',
        }
        text_colors = {
            'primary': '#1f2937',
            'secondary': '#1f2937',
            'outline': '#ffffff',
            'dark': '#ffffff',
            'gradient': '#ffffff',
            'ghost': '#ffffff',
            'success': '#ffffff',
            'danger': '#ffffff',
        }
        bg = colors.get(obj.style, '#6b7280')
        color = text_colors.get(obj.style, '#ffffff')
        border = '2px solid white' if obj.style == 'outline' else 'none'
        return format_html(
            '<span style="padding: 4px 12px; background: {}; color: {}; border: {}; '
            'border-radius: 4px; font-size: 11px;">{}</span>',
            bg, color, border, obj.get_style_display()
        )
    style_preview.short_description = 'Style'

    def url_preview(self, obj):
        """Affiche l'URL du bouton."""
        url = obj.get_url()
        if url and url != '#':
            return format_html(
                '<a href="{}" target="_blank" style="color: #667eea;">{}</a>',
                url,
                url[:30] + '...' if len(url) > 30 else url
            )
        return '-'
    url_preview.short_description = 'URL'

    def usage_count(self, obj):
        """Affiche le nombre d'utilisations."""
        count = obj.get_usage_count()
        return format_html(
            '<span style="padding: 3px 8px; background: #6c757d; color: white; '
            'border-radius: 10px;">{}</span>',
            count
        )
    usage_count.short_description = 'Utilisations'


@admin.register(ButtonAssignment)
class ButtonAssignmentAdmin(OrderableAdminMixin, admin.ModelAdmin):
    list_display = ['button', 'content_type', 'object_id', 'content_object_display', 'order']
    list_filter = ['content_type', 'button']
    list_editable = ['order']
    search_fields = ['button__name', 'button__text']
    autocomplete_fields = ['button']
    ordering = ['content_type', 'object_id', 'order']

    fieldsets = (
        (None, {
            'fields': ('button', 'order')
        }),
        ('Objet associe', {
            'fields': ('content_type', 'object_id'),
            'description': 'Selectionnez le type de contenu et l\'ID de l\'objet auquel associer ce bouton.'
        }),
    )

    def content_object_display(self, obj):
        if obj.content_object:
            return str(obj.content_object)
        return '-'
    content_object_display.short_description = 'Objet'
