from django.db import models
from django.dispatch import receiver
from django.core.cache import cache

import os
import uuid

class menu(models.Model):
    type_choices = [
        ('top', 'top'),
        ('menu', 'menu')
    ]
    viewtype_choices = [
        ('view', 'view'),
        ('url', 'url'),
        ('listview', 'listview'),
        ('imageview', 'imageview'),
    ]
    uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
    subject = models.CharField(max_length=100)
    parent = models.ForeignKey('menu', on_delete=models.SET_NULL, blank=True, null=True)
    ordering = models.IntegerField(blank=True, null=True)
    type = models.CharField(max_length=10, choices=type_choices, default='menu')
    viewtype = models.CharField(max_length=10, choices=viewtype_choices, default='listview')
    related = models.ForeignKey('post', on_delete=models.SET_NULL, blank=True, null=True)
    related_url = models.TextField(blank=True, null=True)
    display = models.BooleanField(default=True)

    intro_title = models.TextField(blank=True, null=True)
    intro_subtitle = models.TextField(blank=True, null=True)

    def __str__(self):
        if ( self.parent ):
            return '%s > %s' % (str(self.parent), self.subject,)
        else:
            return self.subject

    def save(self, *args, **kwargs):
        if ( self.ordering == None ):
            self.ordering = len(menu.objects.filter(parent=self.parent, type=self.type))
        if ( self.type == 'top' ):
            cache.set('topmenues', menu.objects.filter(type='top', display=True).order_by('ordering').values('uuid', 'subject', 'viewtype', 'related', 'related_url', 'intro_title', 'intro_subtitle'))
        return super(menu, self).save(*args, **kwargs)

class post(models.Model):
    uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
    parent = models.ForeignKey('menu', on_delete=models.SET_NULL, blank=True, null=True)
    subject = models.CharField(max_length=500, blank=True, null=True)
    brief = models.CharField(max_length=500, blank=True, null=True)
    contents = models.TextField(blank=True)
    tag = models.CharField(max_length=500, blank=True, null=True)
    modify_at = models.DateTimeField(auto_now=True)
    create_at = models.DateTimeField(auto_now_add=True)
    display = models.BooleanField(default=True)
    attach = models.ManyToManyField('file', blank=True)

    def delete(self):
        #self.attach.all().delete()
        return super(post, self).delete()

class file(models.Model):
    uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
    name = models.CharField(max_length=255)
    binary = models.FileField(upload_to='./%Y/%m/%d/')
    create_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        if (not self.binary):
            return '%s(%s)' % (self.binary.url, self.name,)
        else:
            return 'None({})'.format(self.name)

@receiver(models.signals.post_delete, sender=file)
def auto_delete_file_on_delete(sender, instance, **kwargs):
    if instance.binary:
        if os.path.isfile(instance.binary.path):
            os.remove('%s' % (instance.binary.path,) )