from typing import Any

from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

from core.models import User
from core.views import MultipleImageField
from core.views.forms import SelectDate
from core.views.widgets.ajax_select import AutoCompleteSelectMultipleGroup
from sas.models import Album, Picture, PictureModerationRequest
from sas.widgets.ajax_select import AutoCompleteSelectAlbum


class AlbumCreateForm(forms.ModelForm):
    class Meta:
        model = Album
        fields = ["name", "parent"]
        labels = {"name": _("Add a new album")}
        widgets = {"parent": forms.HiddenInput}

    def __init__(self, *args, owner: User, **kwargs):
        super().__init__(*args, **kwargs)
        self.instance.owner = owner
        if owner.has_perm("sas.moderate_sasfile"):
            self.instance.is_moderated = True
            self.instance.moderator = owner

    def clean(self):
        if not self.instance.owner.can_edit(self.instance.parent):
            raise ValidationError(_("You do not have the permission to do that"))
        return super().clean()


class PictureUploadForm(forms.Form):
    images = MultipleImageField(label=_("Upload images"), required=False)


class PictureEditForm(forms.ModelForm):
    class Meta:
        model = Picture
        fields = ["name", "parent"]
        widgets = {"parent": AutoCompleteSelectAlbum}


class AlbumEditForm(forms.ModelForm):
    class Meta:
        model = Album
        fields = ["name", "date", "file", "parent", "edit_groups"]
        widgets = {
            "parent": AutoCompleteSelectAlbum,
            "edit_groups": AutoCompleteSelectMultipleGroup,
        }

    name = forms.CharField(max_length=Album.NAME_MAX_LENGTH, label=_("file name"))
    date = forms.DateField(label=_("Date"), widget=SelectDate, required=True)
    recursive = forms.BooleanField(label=_("Apply rights recursively"), required=False)


class PictureModerationRequestForm(forms.ModelForm):
    """Form to create a PictureModerationRequest.

    The form only manages the reason field,
    because the author and the picture are set in the view.
    """

    class Meta:
        model = PictureModerationRequest
        fields = ["reason"]

    def __init__(self, *args, user: User, picture: Picture, **kwargs):
        super().__init__(*args, **kwargs)
        self.user = user
        self.picture = picture

    def clean(self) -> dict[str, Any]:
        if PictureModerationRequest.objects.filter(
            author=self.user, picture=self.picture
        ).exists():
            raise forms.ValidationError(
                _("You already requested moderation for this picture.")
            )
        return super().clean()

    def save(self, *, commit=True) -> PictureModerationRequest:
        self.instance.author = self.user
        self.instance.picture = self.picture
        return super().save(commit)