from django.conf import settings
from django.db import models

from apps.core.models import BaseModel


class LeadSettings(BaseModel):
    enable_public_forms = models.BooleanField(default=True)
    enable_admin_notifications = models.BooleanField(default=True)
    enable_user_auto_reply = models.BooleanField(default=True)
    admin_notification_emails = models.TextField(
        blank=True,
        help_text="Comma-separated emails for lead notifications.",
    )
    export_enabled = models.BooleanField(default=True)

    class Meta:
        verbose_name = "Lead Settings"
        verbose_name_plural = "Lead Settings"

    def __str__(self) -> str:
        return "Lead Settings"


class LeadSubmission(BaseModel):
    LEAD_TYPE_NEWSLETTER = "newsletter_subscriber"
    LEAD_TYPE_WAITLIST = "waitlist_registration"
    LEAD_TYPE_GENERAL = "general_enquiry"
    LEAD_TYPE_PRODUCT = "product_enquiry"
    LEAD_TYPE_SERVICE = "service_enquiry"
    LEAD_TYPE_PARTNER = "partner_application"
    LEAD_TYPE_VENDOR = "vendor_registration"
    LEAD_TYPE_VOLUNTEER = "volunteer_application"
    LEAD_TYPE_CONTACT = "contact_message"
    LEAD_TYPE_EARLY_ACCESS = "early_access_request"

    LEAD_TYPE_CHOICES = (
        (LEAD_TYPE_NEWSLETTER, "Newsletter Subscriber"),
        (LEAD_TYPE_WAITLIST, "Waitlist Registration"),
        (LEAD_TYPE_GENERAL, "General Enquiry"),
        (LEAD_TYPE_PRODUCT, "Product Enquiry"),
        (LEAD_TYPE_SERVICE, "Service Enquiry"),
        (LEAD_TYPE_PARTNER, "Partner Application"),
        (LEAD_TYPE_VENDOR, "Vendor Registration"),
        (LEAD_TYPE_VOLUNTEER, "Volunteer Application"),
        (LEAD_TYPE_CONTACT, "Contact Message"),
        (LEAD_TYPE_EARLY_ACCESS, "Early Access Request"),
    )

    STATUS_NEW = "new"
    STATUS_CONTACTED = "contacted"
    STATUS_INTERESTED = "interested"
    STATUS_FOLLOW_UP = "follow_up"
    STATUS_CONVERTED = "converted"
    STATUS_CLOSED = "closed"
    STATUS_SPAM = "spam"

    STATUS_CHOICES = (
        (STATUS_NEW, "New"),
        (STATUS_CONTACTED, "Contacted"),
        (STATUS_INTERESTED, "Interested"),
        (STATUS_FOLLOW_UP, "Follow-up"),
        (STATUS_CONVERTED, "Converted"),
        (STATUS_CLOSED, "Closed"),
        (STATUS_SPAM, "Spam"),
    )

    lead_type = models.CharField(max_length=40, choices=LEAD_TYPE_CHOICES, db_index=True)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default=STATUS_NEW, db_index=True)

    full_name = models.CharField(max_length=160, blank=True)
    email = models.EmailField(blank=True, db_index=True)
    mobile_number = models.CharField(max_length=20, blank=True, db_index=True)
    city = models.CharField(max_length=120, blank=True)
    interested_category = models.CharField(max_length=160, blank=True)
    subject = models.CharField(max_length=255, blank=True)
    message = models.TextField(blank=True)
    notes = models.TextField(blank=True)

    source_page_url = models.CharField(max_length=500, blank=True)
    source_page_name = models.CharField(max_length=255, blank=True, db_index=True)
    source_page_type = models.CharField(max_length=100, blank=True, db_index=True)
    campaign_source = models.CharField(max_length=120, blank=True, db_index=True)
    referral_source = models.CharField(max_length=255, blank=True)

    ip_address = models.GenericIPAddressField(null=True, blank=True)
    user_agent = models.TextField(blank=True)
    device_info = models.CharField(max_length=120, blank=True)

    payload = models.JSONField(default=dict, blank=True)

    is_spam = models.BooleanField(default=False, db_index=True)
    honeypot = models.CharField(max_length=255, blank=True)

    assigned_to = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="assigned_public_leads",
    )
    admin_remarks = models.TextField(blank=True)
    contacted_at = models.DateTimeField(null=True, blank=True)
    converted_at = models.DateTimeField(null=True, blank=True)
    closed_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        indexes = [
            models.Index(fields=["lead_type", "status", "created_at"], name="lead_type_status_idx"),
            models.Index(fields=["email", "lead_type", "created_at"], name="lead_email_type_idx"),
            models.Index(fields=["source_page_name", "created_at"], name="lead_source_page_idx"),
        ]
        ordering = ["-created_at"]

    def __str__(self) -> str:
        return f"{self.lead_type} - {self.email or self.full_name or self.id}"
