import secrets
import string

from django.db import models
from django.core.validators import EmailValidator
from django.utils import timezone

from core.models import TimeStampedModel


class WaitlistEntry(TimeStampedModel):
    """
    A single waitlist signup with email verification.
    site field distinguishes between Lifey and PlanySoft waitlists
    if a second one is ever added.
    """
    SITE_CHOICES = [
        ('lifey', 'Lifey'),
        ('planysoft', 'PlanySoft'),
    ]

    email = models.EmailField(unique=True, validators=[EmailValidator()])
    site = models.CharField(max_length=20, choices=SITE_CHOICES, default='lifey')
    verification_code = models.CharField(max_length=6, blank=True)
    verified = models.BooleanField(default=False)
    verified_at = models.DateTimeField(null=True, blank=True)
    code_expires_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['email']),
            models.Index(fields=['verified']),
            models.Index(fields=['site', 'verified']),
        ]

    def __str__(self):
        return f"{self.email} ({self.site}) {'✓' if self.verified else '✗'}"

    def generate_verification_code(self):
        """Generate a fresh 6-digit code and reset expiry to 24h from now."""
        self.verification_code = ''.join(secrets.choice(string.digits) for _ in range(6))
        self.code_expires_at = timezone.now() + timezone.timedelta(hours=24)
        self.save(update_fields=['verification_code', 'code_expires_at'])
        return self.verification_code

    def is_code_expired(self):
        if not self.code_expires_at:
            return True
        return timezone.now() > self.code_expires_at

    def verify_code(self, code):
        """
        Validate the submitted code.
        Returns (success: bool, message: str).
        """
        if self.verified:
            return False, 'Already verified.'

        if self.is_code_expired():
            return False, 'Code expired. Request a new one.'

        if self.verification_code != code:
            return False, 'Invalid code.'

        self.verified = True
        self.verified_at = timezone.now()
        self.save(update_fields=['verified', 'verified_at'])
        return True, 'Email verified successfully.'