"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 18.08.22

"""
from dal import autocomplete
from django import forms
from django.utils.translation import gettext_lazy as _

from intervention.inputs import TextToClipboardInput
from konova.forms.modals import BaseModalForm
from konova.utils.message_templates import ENTRY_REMOVE_MISSING_PERMISSION
from user.models import Team, User


class ShareModalForm(BaseModalForm):
    url = forms.CharField(
        label=_("Share link"),
        label_suffix="",
        help_text=_("Send this link to users who you want to have writing access on the data"),
        required=False,
        widget=TextToClipboardInput(
            attrs={
                "readonly": True,
                "class": "form-control",
            }
        )
    )
    teams = forms.ModelMultipleChoiceField(
        label=_("Add team to share with"),
        label_suffix="",
        help_text=_("Multiple selection possible - You can only select teams which do not already have access."),
        required=False,
        queryset=Team.objects.all(),
        widget=autocomplete.ModelSelect2Multiple(
            url="user:share-team-autocomplete",
            attrs={
                "data-placeholder": _("Click for selection"),
                "data-minimum-input-length": 3,
            },
        ),
    )
    users = forms.ModelMultipleChoiceField(
        label=_("Add user to share with"),
        label_suffix="",
        help_text=_("Multiple selection possible - You can only select users which do not already have access. Enter the full username."),
        required=False,
        queryset=User.objects.all(),
        widget=autocomplete.ModelSelect2Multiple(
            url="user:share-user-autocomplete",
            attrs={
                "data-placeholder": _("Click for selection"),
                "data-minimum-input-length": 3,
            },
        ),
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.form_title = _("Share")
        self.form_caption = _("Share settings for {}").format(self.instance.identifier)
        self.template = "modal/modal_form.html"

        # Make sure an access_token is set
        if self.instance.access_token is None:
            self.instance.generate_access_token()

        self._init_fields()

    def _user_team_valid(self):
        """ Checks whether users and teams have been removed by the user and if the user is allowed to do so or not

        Returns:

        """
        users = self.cleaned_data.get("users", User.objects.none())
        teams = self.cleaned_data.get("teams", Team.objects.none())

        _is_valid = True
        if self.user.is_default_group_only():
            shared_users = self.instance.shared_users
            shared_teams = self.instance.shared_teams

            shared_users_are_removed = not set(shared_users).issubset(users)
            shared_teams_are_removed = not set(shared_teams).issubset(teams)

            if shared_users_are_removed:
                self.add_error(
                    "users",
                    ENTRY_REMOVE_MISSING_PERMISSION
                )
                _is_valid = False
            if shared_teams_are_removed:
                self.add_error(
                    "teams",
                    ENTRY_REMOVE_MISSING_PERMISSION
                )
                _is_valid = False
        return _is_valid

    def is_valid(self):
        """ Extended validity check

        Returns:

        """
        super_valid = super().is_valid()
        user_team_valid = self._user_team_valid()
        _is_valid = super_valid and user_team_valid
        return _is_valid

    def _init_fields(self):
        """ Wraps initializing of fields

        Returns:

        """
        # Initialize share_link field
        share_link = self.instance.get_share_link()
        self.share_link = self.request.build_absolute_uri(share_link)
        self.initialize_form_field(
            "url",
            self.share_link
        )

        form_data = {
            "teams": self.instance.teams.all(),
            "users": self.instance.users.all(),
        }
        self.load_initial_data(form_data)

    def save(self):
        self.instance.update_shared_access(self)