from django.contrib import admin
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.urls import path, reverse
from .models import Subscriber, Campaign, LeadMagnet


@admin.register(Subscriber)
class SubscriberAdmin(admin.ModelAdmin):
    list_display = ['email', 'first_name', 'status', 'source', 'created_at']
    list_filter = ['status', 'source', 'created_at']
    search_fields = ['email', 'first_name']
    readonly_fields = ['confirmation_token', 'unsubscribe_token', 'created_at', 'confirmed_at', 'unsubscribed_at', 'ip_address']
    date_hierarchy = 'created_at'

    fieldsets = [
        ('Informations', {
            'fields': ['email', 'first_name', 'status', 'source']
        }),
        ('Tokens', {
            'fields': ['confirmation_token', 'unsubscribe_token'],
            'classes': ['collapse']
        }),
        ('Dates', {
            'fields': ['created_at', 'confirmed_at', 'unsubscribed_at', 'ip_address'],
            'classes': ['collapse']
        }),
    ]


@admin.register(Campaign)
class CampaignAdmin(admin.ModelAdmin):
    list_display = ['subject', 'status', 'recipients_count', 'created_at', 'sent_at']
    list_filter = ['status', 'created_at']
    search_fields = ['subject', 'content']
    readonly_fields = ['status', 'recipients_count', 'created_at', 'sent_at']
    date_hierarchy = 'created_at'

    fieldsets = [
        ('Contenu', {
            'fields': ['subject', 'content'],
            'description': 'Rédigez votre newsletter. Vous pouvez utiliser du HTML et les variables {{ prenom }} pour personnaliser.'
        }),
        ('Statistiques', {
            'fields': ['status', 'recipients_count', 'created_at', 'sent_at'],
            'classes': ['collapse']
        }),
    ]

    change_form_template = 'admin/newsletter/campaign/change_form.html'

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path(
                '<int:campaign_id>/send/',
                self.admin_site.admin_view(self.send_campaign),
                name='newsletter_campaign_send',
            ),
            path(
                '<int:campaign_id>/preview/',
                self.admin_site.admin_view(self.preview_campaign),
                name='newsletter_campaign_preview',
            ),
        ]
        return custom_urls + urls

    def send_campaign(self, request, campaign_id):
        campaign = Campaign.objects.get(pk=campaign_id)

        if campaign.status == 'sent':
            messages.error(request, "Cette campagne a déjà été envoyée.")
        else:
            count = campaign.send()
            messages.success(request, f"Newsletter envoyée à {count} abonné(s) !")

        return HttpResponseRedirect(reverse('admin:newsletter_campaign_changelist'))

    def preview_campaign(self, request, campaign_id):
        from django.http import HttpResponse
        campaign = Campaign.objects.get(pk=campaign_id)

        # Créer un faux subscriber pour la preview
        class FakeSubscriber:
            first_name = "Prénom"
            email = "exemple@email.com"
            unsubscribe_token = "00000000-0000-0000-0000-000000000000"

        from django.template import Template, Context
        template = Template(campaign.content)
        context = Context({
            'prenom': 'Prénom',
            'email': 'exemple@email.com',
            'unsubscribe_url': 'https://joper.fr/newsletter/unsubscribe/exemple/',
        })
        html_content = template.render(context)
        full_html = campaign._wrap_in_template(html_content, FakeSubscriber())

        return HttpResponse(full_html)


@admin.register(LeadMagnet)
class LeadMagnetAdmin(admin.ModelAdmin):
    list_display = ['title', 'slug', 'is_active', 'download_count', 'created_at']
    list_filter = ['is_active', 'created_at']
    search_fields = ['title', 'description']
    readonly_fields = ['download_token', 'download_count', 'created_at']
    prepopulated_fields = {'slug': ('title',)}

    fieldsets = [
        ('Contenu', {
            'fields': ['title', 'slug', 'description', 'file', 'cover_image']
        }),
        ('Paramètres', {
            'fields': ['is_active']
        }),
        ('Statistiques', {
            'fields': ['download_token', 'download_count', 'created_at'],
            'classes': ['collapse']
        }),
    ]
