# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from django import template
from django.template import defaultfilters
from django.utils.encoding import force_str
from django.utils.translation import gettext_lazy as _

from horizon import exceptions
from horizon import forms
from horizon import messages

from sahara_dashboard.api import sahara as saharaclient
from sahara_dashboard.content.data_processing.utils \
    import helpers


class ChoosePluginForm(forms.SelfHandlingForm):
    def __init__(self, request, *args, **kwargs):
        super(ChoosePluginForm, self).__init__(request, *args, **kwargs)
        self._generate_plugin_version_fields(request)
        self.help_text_template = ("job_wizard/"
                                   "_plugin_select_help.html")

    def handle(self, request, context):
        try:
            hlps = helpers.Helpers(request)
            hlps.reset_guide()
            plugin_name = context["plugin_name"]
            request.session["plugin_name"] = plugin_name
            request.session["plugin_version"] = (
                context[plugin_name + "_version"])
            messages.success(request, _("Cluster type chosen"))
            return True
        except Exception:
            exceptions.handle(request,
                              _("Unable to set cluster type"))
            return False

    def _generate_plugin_version_fields(self, request):
        sahara = saharaclient.client(request)
        plugins = sahara.plugins.list()
        plugin_choices = [(plugin.name, plugin.title) for plugin in plugins]

        self.fields["plugin_name"] = forms.ChoiceField(
            label=_("Plugin Name"),
            choices=plugin_choices,
            widget=forms.Select(attrs={"class": "switchable",
                                       "data-slug": "plugin"}))

        for plugin in plugins:
            field_name = plugin.name + "_version"
            choice_field = forms.ChoiceField(
                label=_("Version"),
                required=False,
                choices=[(version, version) for version in plugin.versions],
                widget=forms.Select(
                    attrs={"class": "switched",
                           "data-switch-on": "plugin",
                           "data-plugin-" + plugin.name: plugin.title})
            )
            self.fields[field_name] = choice_field

    def get_help_text(self, extra_context=None):
        text = ""
        extra_context = extra_context or {}
        if self.help_text_template:
            tmpl = template.loader.get_template(self.help_text_template)
            text += tmpl.render(extra_context, self.request)
        else:
            text += defaultfilters.linebreaks(force_str(self.help_text))
        return defaultfilters.safe(text)

    class Meta(object):
        name = _("Choose plugin type and version")


class ChooseJobTypeForm(forms.SelfHandlingForm):
    guide_job_type = forms.ChoiceField(
        label=_("Job Type"),
        widget=forms.Select())

    def __init__(self, request, *args, **kwargs):
        super(ChooseJobTypeForm, self).__init__(request, *args, **kwargs)
        self.help_text_template = ("job_wizard/"
                                   "_job_type_select_help.html")

        self.fields["guide_job_type"].choices = \
            self.populate_guide_job_type_choices()

    def populate_guide_job_type_choices(self):
        choices = [(x, helpers.JOB_TYPE_MAP[x][0])
                   for x in helpers.JOB_TYPE_MAP]
        return choices

    def handle(self, request, context):
        try:
            hlps = helpers.Helpers(request)
            job_type = context["guide_job_type"]
            if force_str(request.session.get("guide_job_type")) != (
                    force_str(helpers.JOB_TYPE_MAP[job_type][0])):
                hlps.reset_job_guide()
                request.session["guide_job_type"] = (
                    helpers.JOB_TYPE_MAP[job_type][0])
                messages.success(request, _("Job type chosen"))
            return True
        except Exception:
            exceptions.handle(request,
                              _("Unable to set job type"))
            return False
