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


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)
    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)