"""
WebPImageField — drop-in replacement for models.ImageField.
Converts every uploaded image to WebP (quality 85) on save,
regardless of the original format. The stored filename always
ends in .webp.
"""
import io
import os

from django.core.files.base import ContentFile
from django.db.models.fields.files import ImageField, ImageFieldFile


class WebPImageFieldFile(ImageFieldFile):
    """FieldFile subclass that converts to WebP before persisting."""

    def save(self, name, content, save=True):
        try:
            from PIL import Image

            content.seek(0)
            img = Image.open(content)
            img.load()  # force decode before the stream is closed

            output = io.BytesIO()
            if img.mode in ('RGBA', 'LA', 'P'):
                img = img.convert('RGBA')
            else:
                img = img.convert('RGB')
            img.save(output, format='WEBP', quality=85, method=6)
            output.seek(0)

            name = os.path.splitext(name)[0] + '.webp'
            content = ContentFile(output.read(), name=name)
        except Exception:
            # If conversion fails for any reason, fall back to the original
            pass

        super().save(name, content, save)


class WebPImageField(ImageField):
    """ImageField that stores all uploads as WebP."""
    attr_class = WebPImageFieldFile

    def deconstruct(self):
        # Reconstruct as a plain ImageField so no new migrations are generated.
        name, path, args, kwargs = super().deconstruct()
        path = 'django.db.models.ImageField'
        return name, path, args, kwargs
