import random

from django.db import models
from django_softdelete.models import SoftDeleteModel

from core.settings import MAIL_DOMAIN, ACTIVE_SPAM_TRAINING
from files.models import AbstractFile
from inventory.models import Event
from tickets.models import IssueThread


class Email(SoftDeleteModel):
    id = models.AutoField(primary_key=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    body = models.TextField()
    subject = models.CharField(max_length=255)
    sender = models.CharField(max_length=255)
    recipient = models.CharField(max_length=255)
    reference = models.CharField(max_length=255, null=True, unique=True)
    in_reply_to = models.CharField(max_length=255, null=True)
    raw_file = models.FileField(upload_to='raw_mail/')
    issue_thread = models.ForeignKey(IssueThread, models.SET_NULL, null=True, related_name='emails')
    event = models.ForeignKey(Event, models.SET_NULL, null=True)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        if not self.reference:
            self.reference = f'<{random.randint(0, 1000000000):09}@{MAIL_DOMAIN}>'
            self.save()

    def train_spam(self):
        if ACTIVE_SPAM_TRAINING and self.raw_file.path:
            import subprocess
            path = self.raw_file.path
            subprocess.run(["rspamc", "learn_spam", path])

    def train_ham(self):
        if ACTIVE_SPAM_TRAINING and self.raw_file.path:
            import subprocess
            path = self.raw_file.path
            subprocess.run(["rspamc", "learn_ham", path])


class EventAddress(models.Model):
    id = models.AutoField(primary_key=True)
    event = models.ForeignKey(Event, models.SET_NULL, null=True, related_name='addresses')
    address = models.CharField(max_length=255)


class EmailAttachment(AbstractFile):
    email = models.ForeignKey(Email, models.CASCADE, related_name='attachments', null=True)
    name = models.CharField(max_length=255)