from django.db import models
from django.contrib.auth import get_user_model
from django.utils import timezone

User = get_user_model()

class NotificationTemplate(models.Model):
    TEMPLATE_TYPES = [
        ('sms_payment_received', 'SMS - Payment Received'),
        ('sms_payment_pending', 'SMS - Payment Pending'),
        ('sms_invoice_created', 'SMS - Invoice Created'),
        ('email_payment_received', 'Email - Payment Received'),
        ('email_payment_pending', 'Email - Payment Pending'),
        ('email_invoice_created', 'Email - Invoice Created'),
        ('sms_custom', 'SMS - Custom'),
        ('email_custom', 'Email - Custom'),
        # Ticket notifications
        ('sms_ticket_assigned', 'SMS - Ticket Assigned (Technician)'),
        ('sms_appointment_reminder', 'SMS - Appointment Reminder'),
        ('sms_appointment_confirmed', 'SMS - Appointment Confirmed (Customer)'),
        ('sms_technician_arriving', 'SMS - Technician Arriving'),
        ('sms_service_completed', 'SMS - Service Completed'),
        ('sms_ticket_overdue', 'SMS - Ticket Overdue Alert'),
        ('sms_schedule_summary', 'SMS - Daily Schedule Summary'),
        ('sms_ticket_status_change', 'SMS - Ticket Status Change'),
        ('email_ticket_assigned', 'Email - Ticket Assigned'),
        ('email_ticket_status_change', 'Email - Ticket Status Change'),
    ]

    name = models.CharField(max_length=100)
    template_type = models.CharField(max_length=50, choices=TEMPLATE_TYPES, unique=True)
    subject = models.CharField(max_length=200, blank=True, help_text="For email templates only")
    content = models.TextField(help_text="Use {{variable}} for dynamic content")
    variables_help = models.TextField(blank=True, help_text="Available variables for this template")
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

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

    class Meta:
        ordering = ['template_type', 'name']

class SMSLog(models.Model):
    STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('sent', 'Sent'),
        ('failed', 'Failed'),
        ('delivered', 'Delivered'),
    ]

    recipient_phone = models.CharField(max_length=15)
    recipient_name = models.CharField(max_length=200, blank=True)
    message = models.TextField()
    template_used = models.ForeignKey(NotificationTemplate, on_delete=models.SET_NULL, null=True, blank=True)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    sent_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='sent_sms_logs')
    sent_at = models.DateTimeField(default=timezone.now)
    delivered_at = models.DateTimeField(null=True, blank=True)
    error_message = models.TextField(blank=True, null=True)

    # Link to related objects
    customer_id = models.PositiveIntegerField(null=True, blank=True)
    payment_id = models.CharField(max_length=50, blank=True, null=True)
    invoice_id = models.PositiveIntegerField(null=True, blank=True)

    class Meta:
        ordering = ['-sent_at']
        verbose_name = "SMS Log"
        verbose_name_plural = "SMS Logs"

    def __str__(self):
        return f"SMS to {self.recipient_phone} - {self.status}"

class EmailLog(models.Model):
    STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('sent', 'Sent'),
        ('failed', 'Failed'),
        ('delivered', 'Delivered'),
    ]

    EMAIL_TYPE_CHOICES = [
        ('customer_invitation', 'Customer Invitation'),
        ('employee_invitation', 'Employee Invitation'), 
        ('password_reset', 'Password Reset'),
        ('test_email', 'Test Email'),
        ('invoice', 'Invoice Notification'),
        ('system', 'System Notification'),
        ('general', 'General'),
        ('other', 'Other'),
    ]

    recipient_email = models.EmailField()
    recipient_name = models.CharField(max_length=200, blank=True)
    subject = models.CharField(max_length=500)
    message = models.TextField()
    email_type = models.CharField(max_length=30, choices=EMAIL_TYPE_CHOICES, default='other')
    template_used = models.ForeignKey(NotificationTemplate, on_delete=models.SET_NULL, null=True, blank=True)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    sent_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='sent_notification_emails')
    sent_at = models.DateTimeField(default=timezone.now)
    delivered_at = models.DateTimeField(null=True, blank=True)
    error_message = models.TextField(blank=True, null=True)

    # Link to related objects
    customer_id = models.PositiveIntegerField(null=True, blank=True)
    employee_id = models.PositiveIntegerField(null=True, blank=True, help_text="Employee ID if email is employee-related")
    payment_id = models.CharField(max_length=50, blank=True, null=True)
    invoice_id = models.PositiveIntegerField(null=True, blank=True)

    class Meta:
        ordering = ['-sent_at']
        verbose_name = "Email Log"
        verbose_name_plural = "Email Logs"

    def __str__(self):
        return f"Email to {self.recipient_email} - {self.status}"