from django.db import models

class EmailAccount(models.Model):
    name = models.CharField(max_length=100, help_text="اسم توضيحي للحساب (مثلاً: إيميل المبيعات)")
    email_address = models.EmailField(unique=True)
    password = models.CharField(max_length=255, help_text="كلمة مرور التطبيق (App Password)")
    imap_server = models.CharField(max_length=100, default='imap.gmail.com')
    smtp_server = models.CharField(max_length=100, default='smtp.gmail.com')
    smtp_port = models.IntegerField(default=465, help_text="منفذ الإرسال (مثلاً 465 للـ SSL)")
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.name} ({self.email_address})"
        
    class Meta:
        verbose_name = "حساب إيميل"
        verbose_name_plural = "حسابات الإيميل"

class Client(models.Model):
    CLIENT_STATUS_CHOICES = [
        ('lead', 'استفسار / محتمل'),
        ('active', 'عميل حالي'),
        ('vip', 'عميل مميز (VIP)'),
        ('reseller', 'موزع (Reseller)'),
        ('spam', 'تجاهل / مزعج'),
    ]

    name = models.CharField(max_length=255, null=True, blank=True)
    email = models.EmailField(unique=True)
    phone = models.CharField(max_length=50, null=True, blank=True)
    company = models.CharField(max_length=255, null=True, blank=True)
    status = models.CharField(max_length=20, choices=CLIENT_STATUS_CHOICES, default='lead')
    article_balance = models.IntegerField(default=0, help_text="رصيد المقالات المتبقي للموزع")
    total_spent = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, help_text="إجمالي المدفوعات")
    financial_notes = models.TextField(null=True, blank=True, help_text="طريقة الدفع والملاحظات المالية")
    notes = models.TextField(null=True, blank=True, help_text="ملاحظات عن العميل")
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name if self.name else self.email
        
    class Meta:
        verbose_name = "عميل"
        verbose_name_plural = "العملاء"

class EmailMessage(models.Model):
    STATUS_CHOICES = [
        ('new', 'جديدة'),
        ('read', 'مقروءة'),
        ('replied', 'تم الرد'),
        ('closed', 'مغلقة'),
    ]

    account = models.ForeignKey(EmailAccount, on_delete=models.CASCADE, related_name='emails')
    client = models.ForeignKey(Client, on_delete=models.SET_NULL, null=True, blank=True, related_name='emails')
    message_id = models.CharField(max_length=255, unique=True)
    subject = models.CharField(max_length=255, null=True, blank=True)
    sender_email = models.EmailField(null=True, blank=True)
    sender_name = models.CharField(max_length=255, null=True, blank=True)
    body_text = models.TextField(null=True, blank=True)
    body_html = models.TextField(null=True, blank=True)
    received_at = models.DateTimeField()
    is_outgoing = models.BooleanField(default=False, help_text="هل هذه رسالة صادرة منك أم واردة؟")
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='new')
    internal_notes = models.TextField(null=True, blank=True, help_text="ملاحظات داخلية لك على هذا الإيميل")

    def __str__(self):
        return f"{self.subject} - {self.sender_email}"
        
    class Meta:
        verbose_name = "رسالة"
        verbose_name_plural = "الرسائل"
        ordering = ['-received_at']

class Website(models.Model):
    name = models.CharField(max_length=255, help_text="اسم الموقع (مثلاً: سعودي توداي)")
    url = models.URLField(help_text="رابط الموقع")
    category = models.CharField(max_length=100, blank=True, help_text="تخصص الموقع (تقني، رياضي، أخبار)")
    regular_price = models.DecimalField(max_digits=10, decimal_places=2, help_text="السعر الافتراضي للعملاء")
    reseller_price = models.DecimalField(max_digits=10, decimal_places=2, help_text="سعر الجملة للموزعين")
    notes = models.TextField(blank=True)
    is_active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "موقع"
        verbose_name_plural = "المواقع"

class Invoice(models.Model):
    PAYMENT_METHOD_CHOICES = [
        ('paypal', 'PayPal'),
        ('vodafone_cash', 'Vodafone Cash'),
        ('bank_transfer', 'تحويل بنكي'),
        ('binance', 'Binance / Crypto'),
        ('other', 'طريقة أخرى'),
    ]

    SERVICE_TYPE_CHOICES = [
        ('guest_post', 'Guest Post'),
        ('backlink', 'Backlink'),
        ('ads', 'إعلانات بنر'),
        ('article', 'كتابة مقالات'),
        ('seo', 'SEO Services'),
        ('other', 'أخرى'),
    ]

    client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='invoices')
    website = models.ForeignKey(Website, on_delete=models.SET_NULL, null=True, blank=True, related_name='invoices')
    website_name_manual = models.CharField(max_length=255, null=True, blank=True, help_text="اسم الموقع (في حال لم يكن في القائمة)")
    service_type = models.CharField(max_length=50, choices=SERVICE_TYPE_CHOICES, default='guest_post')
    article_count = models.IntegerField(default=1, help_text="عدد المقالات في هذه الفاتورة")
    price = models.DecimalField(max_digits=10, decimal_places=2, help_text="السعر الأصلي")
    discount = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, help_text="الخصم")
    final_amount = models.DecimalField(max_digits=10, decimal_places=2, help_text="المبلغ النهائي")
    payment_method = models.CharField(max_length=50, choices=PAYMENT_METHOD_CHOICES, default='paypal')
    is_paid = models.BooleanField(default=True)
    notes = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        name = self.website.name if self.website else self.website_name_manual
        return f"فاتورة #{self.id} - {self.client.name} - {name}"

    def save(self, *args, **kwargs):
        # حساب المبلغ النهائي تلقائياً إذا لم يتم إدخاله
        if not self.final_amount:
            self.final_amount = self.price - self.discount
        
        is_new = self.pk is None
        super().save(*args, **kwargs)
        
        # تحديث إجمالي مدفوعات العميل تلقائياً
        total = Invoice.objects.filter(client=self.client, is_paid=True).aggregate(models.Sum('final_amount'))['final_amount__sum'] or 0
        self.client.total_spent = total
        
        # إذا كان العميل موزعاً وتم إنشاء فاتورة جديدة مدفوعة، يتم زيادة رصيده من المقالات
        if is_new and self.is_paid and self.client.status == 'reseller':
            self.client.article_balance += self.article_count
            
        self.client.save()

    class Meta:
        verbose_name = "فاتورة"
        verbose_name_plural = "الفواتير"
        ordering = ['-created_at']
