from django.db import models
from django.conf import settings


class Lead(models.Model):
    class Status(models.TextChoices):
        NEW = 'new', 'New'
        CONTACTED = 'contacted', 'Contacted'
        QUALIFIED = 'qualified', 'Qualified'
        OPPORTUNITY = 'opportunity', 'Opportunity'
        CUSTOMER = 'customer', 'Customer'
        LOST = 'lost', 'Lost'
        CONVERTED = 'converted', 'Converted'

    assigned_to = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name='assigned_leads'
    )
    research_date = models.DateField(null=True, blank=True)
    vertical = models.CharField(max_length=255, blank=True)
    service = models.CharField(max_length=255, blank=True)


    city = models.CharField(max_length=255, blank=True)
    state = models.CharField(max_length=255, blank=True)
    country = models.CharField(max_length=100, default='India')

    company_name = models.CharField(max_length=255)
    website = models.URLField(max_length=500, blank=True)
    google_maps_url = models.TextField(blank=True)
    linkedin_url = models.TextField(blank=True)
    instagram_url = models.TextField(blank=True)

    branches = models.CharField(max_length=50, blank=True)
    google_reviews = models.CharField(max_length=50, blank=True)

    # Scoring fields
    website_quality = models.IntegerField(null=True, blank=True)
    seo_opportunity = models.IntegerField(null=True, blank=True)
    chatbot_opportunity = models.IntegerField(null=True, blank=True)
    budget_fit = models.IntegerField(null=True, blank=True)
    decision_speed = models.IntegerField(null=True, blank=True)
    offer_fit = models.IntegerField(null=True, blank=True)

    personalization_note = models.TextField(blank=True)
    priority_score = models.IntegerField(null=True, blank=True)
    lead_tier = models.CharField(max_length=10, blank=True)
    current_stage = models.CharField(max_length=100, blank=True)
    next_action = models.CharField(max_length=255, blank=True)
    next_action_date = models.DateField(null=True, blank=True)
    source = models.CharField(max_length=100, blank=True)

    status = models.CharField(max_length=50, choices=Status.choices, default=Status.NEW)
    notes = models.TextField(blank=True)

    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name='created_leads'
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return self.company_name


class LeadContact(models.Model):
    lead = models.ForeignKey(Lead, on_delete=models.CASCADE, related_name='contacts')
    name = models.CharField(max_length=255)
    role = models.CharField(max_length=255, blank=True)
    phone = models.CharField(max_length=50, blank=True)
    email = models.EmailField(blank=True)

    def __str__(self):
        return f"{self.name} ({self.lead.company_name})"


class Task(models.Model):
    class Priority(models.TextChoices):
        LOW = 'low', 'Low'
        MEDIUM = 'medium', 'Medium'
        HIGH = 'high', 'High'

    class Status(models.TextChoices):
        PENDING = 'pending', 'Pending'
        COMPLETED = 'completed', 'Completed'

    lead = models.ForeignKey(Lead, on_delete=models.CASCADE, related_name='tasks')
    assigned_to = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL,
        null=True, blank=True, related_name='assigned_tasks'
    )
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    due_date = models.DateTimeField(null=True, blank=True)
    status = models.CharField(max_length=50, choices=Status.choices, default=Status.PENDING)
    priority = models.CharField(max_length=50, choices=Priority.choices, default=Priority.MEDIUM)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return self.title


class EmailTemplate(models.Model):
    name = models.CharField(max_length=255)
    subject = models.CharField(max_length=500)
    body = models.TextField()
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name


class EmailSequence(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class EmailSequenceStep(models.Model):
    sequence = models.ForeignKey(EmailSequence, on_delete=models.CASCADE, related_name='steps')
    step_number = models.PositiveIntegerField()
    template = models.ForeignKey(EmailTemplate, on_delete=models.CASCADE)
    delay_days = models.PositiveIntegerField(default=0)
    delay_minutes = models.PositiveIntegerField(default=0) 



class Batch(models.Model):
    class Status(models.TextChoices):
        ACTIVE = 'active', 'Active'
        PAUSED = 'paused', 'Paused'
        COMPLETED = 'completed', 'Completed'

    name = models.CharField(max_length=255)
    sequence = models.ForeignKey(EmailSequence, on_delete=models.CASCADE, related_name='batches')
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='batches')
    status = models.CharField(max_length=20, choices=Status.choices, default=Status.ACTIVE)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class BatchLead(models.Model):
    batch = models.ForeignKey(Batch, on_delete=models.CASCADE, related_name='batch_leads')
    lead = models.ForeignKey(Lead, on_delete=models.CASCADE, related_name='batch_leads')
    email = models.EmailField()
    current_step = models.PositiveIntegerField(default=0)
    replied = models.BooleanField(default=False)
    replied_at = models.DateTimeField(null=True, blank=True)
    unsubscribed = models.BooleanField(default=False)
    completed = models.BooleanField(default=False)
    last_email_sent_at = models.DateTimeField(null=True, blank=True)

    class Meta:
        unique_together = ['batch', 'lead']

    def __str__(self):
        return f"{self.batch.name} - {self.lead.company_name}"


class EmailLog(models.Model):
    class Status(models.TextChoices):
        SENT = 'sent', 'Sent'
        FAILED = 'failed', 'Failed'
        REPLIED = 'replied', 'Replied'

    batch_lead = models.ForeignKey(BatchLead, on_delete=models.CASCADE, related_name='email_logs')
    template = models.ForeignKey(EmailTemplate, on_delete=models.SET_NULL, null=True)
    step_number = models.PositiveIntegerField()
    to_email = models.EmailField()
    subject = models.CharField(max_length=500)
    status = models.CharField(max_length=20, choices=Status.choices, default=Status.SENT)
    mailgun_message_id = models.CharField(max_length=500, blank=True)
    sent_at = models.DateTimeField(auto_now_add=True)
    error = models.TextField(blank=True)

    def __str__(self):
        return f"{self.to_email} - Step {self.step_number} - {self.status}"
