import uuid
from django.db import models
from django.utils import timezone


class LeadMagnet(models.Model):
    """Lead magnet resource for newsletter subscribers."""

    title = models.CharField(max_length=200, verbose_name="Titre")
    slug = models.SlugField(unique=True, max_length=100)
    description = models.TextField(verbose_name="Description")
    file = models.FileField(
        upload_to='lead_magnets/',
        verbose_name="Fichier PDF"
    )
    cover_image = models.ImageField(
        upload_to='lead_magnets/covers/',
        blank=True,
        null=True,
        verbose_name="Image de couverture"
    )
    download_token = models.UUIDField(
        default=uuid.uuid4,
        editable=False,
        verbose_name="Token de téléchargement"
    )
    is_active = models.BooleanField(default=True, verbose_name="Actif")
    download_count = models.PositiveIntegerField(default=0, verbose_name="Téléchargements")
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "Lead Magnet"
        verbose_name_plural = "Lead Magnets"
        ordering = ['-created_at']

    def __str__(self):
        return self.title

    def increment_download(self):
        """Increment download count."""
        self.download_count += 1
        self.save(update_fields=['download_count'])


class Subscriber(models.Model):
    """Newsletter subscriber model."""

    SOURCE_CHOICES = [
        ('homepage', 'Page d\'accueil'),
        ('blog', 'Article de blog'),
        ('footer', 'Pied de page'),
        ('popup', 'Pop-up'),
        ('other', 'Autre'),
    ]

    STATUS_CHOICES = [
        ('pending', 'En attente de confirmation'),
        ('confirmed', 'Confirmé'),
        ('unsubscribed', 'Désabonné'),
    ]

    email = models.EmailField(unique=True, verbose_name="Email")
    first_name = models.CharField(
        max_length=100,
        blank=True,
        verbose_name="Prénom"
    )
    source = models.CharField(
        max_length=20,
        choices=SOURCE_CHOICES,
        default='other',
        verbose_name="Source"
    )
    status = models.CharField(
        max_length=20,
        choices=STATUS_CHOICES,
        default='pending',
        verbose_name="Statut"
    )

    # Tokens for confirmation and unsubscribe
    confirmation_token = models.UUIDField(
        default=uuid.uuid4,
        editable=False,
        verbose_name="Token de confirmation"
    )
    unsubscribe_token = models.UUIDField(
        default=uuid.uuid4,
        editable=False,
        verbose_name="Token de désabonnement"
    )

    # Timestamps
    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name="Date d'inscription"
    )
    confirmed_at = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name="Date de confirmation"
    )
    unsubscribed_at = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name="Date de désabonnement"
    )

    # IP for anti-spam
    ip_address = models.GenericIPAddressField(
        null=True,
        blank=True,
        verbose_name="Adresse IP"
    )

    class Meta:
        verbose_name = "Abonné"
        verbose_name_plural = "Abonnés"
        ordering = ['-created_at']

    def __str__(self):
        return self.email

    def confirm(self):
        """Confirm subscription."""
        self.status = 'confirmed'
        self.confirmed_at = timezone.now()
        self.save(update_fields=['status', 'confirmed_at'])

    def unsubscribe(self):
        """Unsubscribe from newsletter."""
        self.status = 'unsubscribed'
        self.unsubscribed_at = timezone.now()
        self.save(update_fields=['status', 'unsubscribed_at'])

    @classmethod
    def get_active_count(cls):
        """Get count of confirmed subscribers."""
        return cls.objects.filter(status='confirmed').count()


class Campaign(models.Model):
    """Newsletter campaign model."""

    STATUS_CHOICES = [
        ('draft', 'Brouillon'),
        ('sent', 'Envoyée'),
    ]

    subject = models.CharField(
        max_length=200,
        verbose_name="Sujet"
    )
    content = models.TextField(
        verbose_name="Contenu",
        help_text="Contenu HTML de l'email. Utilisez {{ prenom }} pour personnaliser."
    )
    status = models.CharField(
        max_length=20,
        choices=STATUS_CHOICES,
        default='draft',
        verbose_name="Statut"
    )

    # Stats
    recipients_count = models.PositiveIntegerField(
        default=0,
        verbose_name="Nombre de destinataires"
    )

    # Timestamps
    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name="Date de création"
    )
    sent_at = models.DateTimeField(
        null=True,
        blank=True,
        verbose_name="Date d'envoi"
    )

    class Meta:
        verbose_name = "Campagne"
        verbose_name_plural = "Campagnes"
        ordering = ['-created_at']

    def __str__(self):
        return f"{self.subject} ({self.get_status_display()})"

    def send(self):
        """Send the campaign to all confirmed subscribers."""
        from django.core.mail import EmailMessage
        from django.template import Template, Context
        from django.conf import settings

        subscribers = Subscriber.objects.filter(status='confirmed')
        sent_count = 0

        for subscriber in subscribers:
            # Personnaliser le contenu
            template = Template(self.content)
            context = Context({
                'prenom': subscriber.first_name or 'ami(e)',
                'email': subscriber.email,
                'unsubscribe_url': f"https://joper.fr/newsletter/unsubscribe/{subscriber.unsubscribe_token}/",
            })
            html_content = template.render(context)

            # Créer l'email complet avec le template
            full_html = self._wrap_in_template(html_content, subscriber)

            msg = EmailMessage(
                subject=self.subject,
                body=full_html,
                from_email=settings.DEFAULT_FROM_EMAIL,
                to=[subscriber.email],
            )
            msg.content_subtype = 'html'

            try:
                msg.send()
                sent_count += 1
            except Exception:
                pass  # Continue avec les autres

        self.status = 'sent'
        self.recipients_count = sent_count
        self.sent_at = timezone.now()
        self.save()

        return sent_count

    def _wrap_in_template(self, content, subscriber):
        """Wrap content in email template."""
        return f'''<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{self.subject}</title>
</head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #1A1A1A; background-color: #FAF9F6; margin: 0; padding: 0;">
    <table width="100%" cellpadding="0" cellspacing="0" style="background-color: #FAF9F6; padding: 40px 20px;">
        <tr>
            <td align="center">
                <table width="600" cellpadding="0" cellspacing="0" style="background-color: #ffffff; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
                    <!-- Header -->
                    <tr>
                        <td style="background-color: #2C3E50; padding: 30px; text-align: center;">
                            <h1 style="color: #ffffff; margin: 0; font-size: 24px; font-weight: bold;">JoPer</h1>
                            <p style="color: #ffffff; margin: 10px 0 0; opacity: 0.9;">Journal Personnel</p>
                        </td>
                    </tr>

                    <!-- Content -->
                    <tr>
                        <td style="padding: 40px 30px;">
                            {content}
                        </td>
                    </tr>

                    <!-- Footer -->
                    <tr>
                        <td style="background-color: #FAF9F6; padding: 20px 30px; text-align: center;">
                            <p style="margin: 0; color: #6B7280; font-size: 13px;">
                                À toi de JoPer !
                            </p>
                            <p style="margin: 10px 0 0; color: #6B7280; font-size: 12px;">
                                <a href="https://joper.fr" style="color: #2C3E50;">joper.fr</a>
                            </p>
                            <p style="margin: 15px 0 0; color: #9CA3AF; font-size: 11px;">
                                <a href="https://joper.fr/newsletter/unsubscribe/{subscriber.unsubscribe_token}/" style="color: #9CA3AF;">Se désabonner</a>
                            </p>
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
</body>
</html>'''
