from django.db import models

from apps.files.models import PostFileModel


class SourceSiteModel(models.Model):
    slug = models.CharField(max_length=64)
    name = models.CharField(max_length=64)
    date_last_import = models.DateTimeField(auto_now=True)
    date_created = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "Source Site"
        verbose_name_plural = "Source Sites"

    def __str__(self):
        if self.name:
            return str(self.name)
        else:
            return str(self.slug)


class CategoryModel(models.Model):
    slug = models.CharField(max_length=64)
    name = models.CharField(max_length=64)
    date_modified = models.DateTimeField(auto_now=True)
    date_created = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "Category"
        verbose_name_plural = "Categories"

    def __str__(self):
        if len(str(self.name)) > 0:
            return str(self.name)
        else:
            return str(self.slug)


class DescriptionModel(models.Model):
    hash = models.CharField(max_length=128)
    content = models.TextField()
    date_modified = models.DateTimeField(auto_now=True, editable=True)
    date_created = models.DateTimeField(auto_now_add=True, editable=True)

    class Meta:
        verbose_name = "Description"
        verbose_name_plural = "Descriptions"

    def __str__(self):
        return str(self.hash)


class PostDescription(models.Model):
    post = models.ForeignKey("PostModel", on_delete=models.CASCADE)
    description = models.ForeignKey(DescriptionModel, on_delete=models.CASCADE)
    date_imported = models.DateTimeField(auto_now_add=True)


class CreatorDescription(models.Model):
    creator = models.ForeignKey("CreatorModel", on_delete=models.CASCADE)
    description = models.ForeignKey(DescriptionModel, on_delete=models.CASCADE)
    date_imported = models.DateTimeField(auto_now_add=True)


class CreatorModel(models.Model):
    creator_id = models.CharField(max_length=128, null=True)
    source_site = models.ForeignKey(
        to=SourceSiteModel, on_delete=models.CASCADE, related_name="creators"
    )
    slug = models.CharField(max_length=64)
    name = models.CharField(max_length=64)
    description = models.ManyToManyField(
        to=DescriptionModel, related_name="creators", through=CreatorDescription
    )
    avatar = models.ForeignKey(
        to=PostFileModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="creators_avatar",
    )
    banner = models.ForeignKey(
        to=PostFileModel,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="creators_banner",
    )
    categories = models.ManyToManyField(to=CategoryModel, related_name="creators")
    date_created = models.DateTimeField(auto_now_add=True, editable=True)
    date_last_import = models.DateTimeField(auto_now=True, editable=True)
    date_imported = models.DateTimeField(auto_now_add=True, editable=True)

    mature = models.BooleanField(default=False)

    class Meta:
        verbose_name = "Creator"
        verbose_name_plural = "Creators"

    def __str__(self):
        return str(self.name)


class TagModel(models.Model):
    slug = models.CharField(max_length=64)
    name = models.CharField(max_length=64)
    date_modified = models.DateTimeField(auto_now=True)
    date_created = models.DateTimeField(auto_now_add=True)
    mature = models.BooleanField(default=False)

    class Meta:
        verbose_name = "Tag"
        verbose_name_plural = "Tags"

    def __str__(self):
        if len(str(self.name)) > 0:
            return str(self.name)
        else:
            return str(self.slug)


class PostModel(models.Model):
    post_id = models.CharField(max_length=128, db_index=True)
    title = models.CharField(max_length=64)
    description = models.ManyToManyField(
        to=DescriptionModel, related_name="posts", through=PostDescription
    )
    creator = models.ForeignKey(
        to=CreatorModel,
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name="posts",
    )
    source_site = models.ForeignKey(
        to=SourceSiteModel, on_delete=models.CASCADE, related_name="posts"
    )
    category = models.ManyToManyField(to=CategoryModel, related_name="posts")

    tags = models.ManyToManyField(to=TagModel, related_name="posts")

    mature = models.BooleanField(default=False)

    files = models.ManyToManyField(to=PostFileModel, related_name="posts")

    date_created = models.DateTimeField(auto_now_add=True, editable=True)
    date_imported = models.DateTimeField(auto_now_add=True, editable=True)
    date_last_import = models.DateTimeField(auto_now=True, editable=True)

    class Meta:
        verbose_name = "Post"
        verbose_name_plural = "Posts"

    def __str__(self):
        return str(self.title)