from django.db import models
from django.utils.translation import gettext_lazy as _
from wagtail.documents.models import AbstractDocument, Document
from wagtail.images.models import (
    AbstractImage,
    AbstractRendition,
    get_upload_to,
    Image,
    WagtailImageField,
)

from vbv_lernwelt.core.admin import User
from vbv_lernwelt.media_files.storage_backends import (
    ContentDocumentsStorage,
    ContentImagesStorage,
    UserDocumentsStorage,
    UserImagesStorage,
)


class ContentDocument(AbstractDocument):
    """
    Content documents are documents that are handled by the CMS.
    """

    file = models.FileField(
        upload_to="documents", verbose_name=_("file"), storage=ContentDocumentsStorage
    )
    display_text = models.CharField(max_length=1024, default="")
    description = models.TextField(default="", blank=True)
    link_display_text = models.CharField(max_length=1024, default="", blank=True)
    thumbnail = models.CharField(default="", max_length=1024, blank=True)

    admin_form_fields = Document.admin_form_fields + (
        "display_text",
        "description",
        "link_display_text",
        "thumbnail",
    )

    def has_permission(self, user: User):
        # TODO: 20-11-2023 Renzo: add more advanced permission handling
        if user.is_authenticated:
            return True


class UserDocument(AbstractDocument):
    """
    Documents that are uploaded by the user and not visible in the CMS.
    Still they are inherited from the Wagtail Document model.
    """

    file = models.FileField(
        upload_to="documents", verbose_name=_("file"), storage=UserDocumentsStorage
    )


class ContentImage(AbstractImage):
    """
    Content images are images that are handled by the CMS.
    """

    file = WagtailImageField(
        verbose_name=_("file"),
        upload_to=get_upload_to,
        width_field="width",
        height_field="height",
        storage=ContentImagesStorage,
    )
    admin_form_fields = Image.admin_form_fields + (
        # Then add the field names here to make them appear in the form:
        # 'caption',
    )


class UserImage(AbstractImage):
    """
    User images are images that are uploaded by the user and not visible in the CMS.
    Still they are inherited from the Wagtail Image model.
    """

    file = WagtailImageField(
        verbose_name=_("file"),
        upload_to=get_upload_to,
        width_field="width",
        height_field="height",
        storage=UserImagesStorage,
    )


class ContentImageRendition(AbstractRendition):
    image = models.ForeignKey(
        ContentImage, on_delete=models.CASCADE, related_name="renditions"
    )

    class Meta:
        unique_together = (("image", "filter_spec", "focal_point_key"),)


class UserImageRendition(AbstractRendition):
    image = models.ForeignKey(
        UserImage, on_delete=models.CASCADE, related_name="renditions"
    )

    class Meta:
        unique_together = (("image", "filter_spec", "focal_point_key"),)
