"""Flow and Stage forms"""

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

from passbook.flows.models import Flow, FlowStageBinding, Stage
from passbook.flows.transfer.importer import FlowImporter
from passbook.lib.widgets import GroupedModelChoiceField


class FlowForm(forms.ModelForm):
    """Flow Form"""

    class Meta:

        model = Flow
        fields = [
            "name",
            "title",
            "slug",
            "designation",
        ]
        help_texts = {
            "title": _("Shown as the Title in Flow pages."),
            "slug": _("Visible in the URL."),
            "designation": _(
                (
                    "Decides what this Flow is used for. For example, the Authentication flow "
                    "is redirect to when an un-authenticated user visits passbook."
                )
            ),
        }
        widgets = {
            "name": forms.TextInput(),
            "title": forms.TextInput(),
        }


class FlowStageBindingForm(forms.ModelForm):
    """FlowStageBinding Form"""

    stage = GroupedModelChoiceField(
        queryset=Stage.objects.all().select_subclasses(), to_field_name="stage_uuid"
    )

    class Meta:

        model = FlowStageBinding
        fields = [
            "target",
            "stage",
            "evaluate_on_plan",
            "re_evaluate_policies",
            "order",
        ]
        widgets = {
            "name": forms.TextInput(),
        }


class FlowImportForm(forms.Form):
    """Form used for flow importing"""

    flow = forms.FileField()

    def clean_flow(self):
        """Check if the flow is valid and rewind the file to the start"""
        flow = self.cleaned_data["flow"].read()
        valid = FlowImporter(flow.decode()).validate()
        if not valid:
            raise ValidationError(_("Flow invalid."))
        self.cleaned_data["flow"].seek(0)
        return self.cleaned_data["flow"]