import os

from django.conf import settings
from django.db import models
from django.db.models import ObjectDoesNotExist
from django.utils import timezone
from uuslug import slugify

from .common_tools import crop_img, delete_img


# Create your models here.

class Book(models.Model):
    """
    它和讨论模型(Discuss)拥有一对多关系。
    """
    name = models.CharField('书籍名称', max_length=32)
    pub_date = models.DateField('出版日期', default=timezone.now, blank=True, null=True)
    slug = models.SlugField(max_length=64, unique=True)
    intro = models.TextField('简介', max_length=1280, blank=True)
    cover = models.ImageField('封面', upload_to='book_cover/%Y/%m/%d', default="book_cover/default.jpg", blank=True)

    publishing = models.ForeignKey("Publishing", on_delete=models.CASCADE, related_name="books", null=True)
    auther = models.ForeignKey("Auther", on_delete=models.CASCADE, related_name="books")
    tags = models.ManyToManyField("Tag", related_name="books")

    viewing = models.IntegerField('查看数', default=0)

    class Meta:
        verbose_name = '书籍'
        verbose_name_plural = '书籍'
        ordering = ['pub_date']
        unique_together = ['name', 'auther', ]

    def __str__(self):
        return "Book(%s)" % self.name

    def save(self, *args, **kwargs):
        cover_default_path = self.cover.field.default.replace('/', '\\')
        if not cover_default_path in self.cover.path:
            try:
                origin_book = Book.objects.get(slug=self.slug)
                if origin_book.cover.path != self.cover.path:
                    # 如果要更改封面,就删除原来的封面
                    try:
                        os.remove(origin_book.cover.path)
                    except FileNotFoundError:
                        pass
            except ObjectDoesNotExist:
                pass

        # 自动根据书籍的名称和作者添加一个slug
        slug = '-by-'.join([self.name, self.auther.name])
        self.slug = slugify(slug)
        ret = super(Book, self).save(*args, **kwargs)

        if not cover_default_path in self.cover.path:
            # 不剪裁默认封面
            COVER_WIDTH = getattr(settings, 'COVER_WIDTH', 210)
            COVER_HEIGHT = getattr(settings, 'COVER_HEIGHT', 280)
            crop_img(self.cover, COVER_WIDTH, COVER_HEIGHT)

        return ret

    def delete(self, *args, **kwargs):
        # 删除书籍时,一并删除它储存在本地的封面图片
        default_path = self.cover.field.default.replace('/', '\\')
        if not default_path in self.cover.path:
            delete_img(self.cover)

        return super().delete(*args, **kwargs)

    def add_viewing(self):
        self.viewing += 1
        self.save()


class Auther(models.Model):
    """
    与书籍模型(Book)是多对一关系。关系在Book中定义。
    """
    name = models.CharField('作者名', max_length=32, unique=True)
    about = models.TextField('关于作者', max_length=1280, blank=True)
    slug = models.SlugField(max_length=32, unique=True)

    class Meta:
        verbose_name = '作者'
        verbose_name_plural = '作者'

    def __str__(self):
        return "Auther(%s)" % self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        ret = super(Auther, self).save(*args, **kwargs)
        return ret

    @property
    def book_num(self):
        return self.books.count()


class Publishing(models.Model):
    """
    与书籍模型(Book)是多对一关系。关系在Book中定义。
    """
    name = models.CharField('出版社名', max_length=32, unique=True)
    establish_date = models.DateField('创建日期', null=True, blank=True)
    about = models.TextField('关于出版社', max_length=1024, blank=True)
    slug = models.SlugField(max_length=32, unique=True)

    class Meta:
        verbose_name = '出版社'
        verbose_name_plural = '出版社'

    def __str__(self):
        return "Publishing(%s)" % self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        ret = super(Publishing, self).save(*args, **kwargs)
        return ret

    @property
    def book_num(self):
        return self.books.count()


class Tag(models.Model):
    """
    与书籍模型(Book)是多对多关系。关系在Book中定义。
    """
    name = models.CharField('标签名', max_length=32, unique=True)
    slug = models.SlugField(max_length=32, unique=True)

    class Meta:
        verbose_name = '书籍标签'
        verbose_name_plural = '书籍标签'

    def __str__(self):
        return "Tag(%s)" % self.name

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        ret = super(Tag, self).save(*args, **kwargs)
        return ret

    @property
    def book_num(self):
        return self.books.count()


class Carousel(models.Model):
    """
    存放首页滚动图
    """
    img = models.ImageField("滚动图", upload_to='carousel/%Y/%d/%d')
    name = models.CharField('图片名字', max_length=32, blank=True)
    title = models.CharField('展示标题', max_length=128, blank=True)
    intro = models.TextField('展示介绍', max_length=128, blank=True)
    link = models.URLField("链接地址", blank=True)

    class Meta:
        verbose_name = '滚动图'
        verbose_name_plural = '滚动图'

    def __str__(self):
        return 'Carousel(name:%s, dir=%s)' % (self.name, str(self.img))

    def save(self, *args, **kwargs):
        ret = super().save(*args, **kwargs)

        CAROUSEL_WIDTH = getattr(settings, 'CAROUSEL_WIDTH', 1600)
        CAROUSEL_HEIGHT = getattr(settings, 'CAROUSEL_HEIGHT', 900)
        crop_img(self.img, CAROUSEL_WIDTH, CAROUSEL_HEIGHT)

        return ret

    def delete(self, *args, **kwargs):
        delete_img(self.img)

        return super().delete(*args, **kwargs)