import os

from django.db import models
from django.core import validators
from django.dispatch import receiver
from account.models import Profile
from homework.models import Solution
from common.validators import FileSizeValidator

from common.middleware import CurrentUserMiddleware


def document_file_name(instance, filename):
    return '/'.join([
        'document',
        instance.solution.task.title,
        instance.uploaded_by.full_name,
        filename
    ])


class Document(models.Model):
    uploaded_by = models.ForeignKey(
        Profile,
        on_delete=models.DO_NOTHING,
        related_name='documents',
        default=CurrentUserMiddleware.get_current_user_profile,
    )
    uploaded_at = models.DateTimeField(auto_now_add=True, editable=False)
    name = models.CharField(max_length=150, blank=True, default='')
    description = models.TextField(blank=True, default='')
    file = models.FileField(
        validators=[
            validators.FileExtensionValidator([
                'png',
                'jpeg',
                'jpg',
                'zip',
            ]),
            FileSizeValidator(size_limit=52428800),  # 52428800 - 50MiB
        ],
        blank=True,
        null=True,
        upload_to=document_file_name
    )
    solution = models.ForeignKey(Solution, related_name='files', on_delete=models.CASCADE)

    def __str__(self):
        return self.name


# Deletes file from filesystem when File object is deleted.
@receiver(models.signals.post_delete, sender=Document)
def auto_delete_file_on_delete(sender, instance, **kwargs):
    if instance.file:
        if os.path.isfile(instance.file.path):
            os.remove(instance.file.path)