"""
Restricted page
"""

from typing import Any

from django.contrib import messages
from django.http import HttpResponse
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _

from horilla_views.cbv_methods import login_required, permission_required
from horilla_views.generic.cbv.views import (
    HorillaDetailedView,
    HorillaFormView,
    HorillaListView,
    HorillaNavView,
    TemplateView,
)
from leave.filters import RestrictLeaveFilter
from leave.forms import RestrictLeaveForm
from leave.models import RestrictLeave


@method_decorator(login_required, name="dispatch")
class RestrictedDaysView(TemplateView):
    """
    for resticted days page
    """

    template_name = "cbv/restricted_days/restricted_days.html"


@method_decorator(login_required, name="dispatch")
class RestrictedDaysList(HorillaListView):
    """
    List view of the resticted days page
    """

    bulk_update_fields = ["department", "job_position"]

    def __init__(self, **kwargs: Any) -> None:
        super().__init__(**kwargs)

        self.search_url = reverse("restrict-filter")
        if self.request.user.has_perm("leave.add_restrictleave"):
            self.action_method = "actions_col"
        self.view_id = "restrictday"

    model = RestrictLeave
    filter_class = RestrictLeaveFilter

    columns = [
        (_("Title"), "title"),
        (_("Start Date"), "start_date"),
        (_("End date"), "end_date"),
        (_("Department"), "department"),
        (_("Job Position"), "job_position_col"),
        (_("Description"), "description"),
    ]

    header_attrs = {"title": """ style="width:180px !important" """}

    sortby_mapping = [
        ("Start Date", "start_date"),
        ("End date", "end_date"),
        ("Department", "department__department"),
        ("Job Position", "job_position_col"),
    ]

    row_attrs = """
                hx-get='{restricted_days_detail_view}?instance_ids={ordered_ids}'
                hx-target="#genericModalBody"
                data-target="#genericModal"
                data-toggle="oh-modal-toggle"
                """


@method_decorator(login_required, name="dispatch")
class RestrictedDaysNav(HorillaNavView):
    """
    Nav bar
    """

    def __init__(self, **kwargs: Any) -> None:
        super().__init__(**kwargs)
        self.search_url = reverse("restrict-filter")
        if self.request.user.has_perm("leave.add_restrictleave"):
            self.create_attrs = f"""
                            data-toggle="oh-modal-toggle"
                            data-target="#genericModal"
                            hx-target="#genericModalBody"
                            hx-get="{reverse('restrict-creation')}"
                            """
            self.actions = [
                {
                    "action": _("Delete"),
                    "attrs": """
                    onclick="
                    bulkRestrictedDaysDelete();
                    "
                    data-action ="delete"
                    style="cursor: pointer; color:red !important"
                    """,
                }
            ]

    nav_title = _("Restricted Days")
    filter_instance = RestrictLeaveFilter()
    filter_body_template = "cbv/restricted_days/filter.html"
    search_swap_target = "#listContainer"
    filter_form_context_name = "form"


@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required("leave.add_restrictleave"), name="dispatch")
class RestrictedDaysFormView(HorillaFormView):
    """
    Create and edit form
    """

    model = RestrictLeave
    form_class = RestrictLeaveForm
    new_display_title = _("Create Restricted Day")

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if self.form.instance.pk:
            self.form_class.verbose_name = _("Update Restricted Day")
        return context

    def form_valid(self, form: RestrictLeaveForm) -> HttpResponse:

        if form.is_valid():
            if form.instance.pk:
                message = _("Restricted Day Updated Successfully")
            else:
                message = _("Restricted Day Created Successfully")
            form.save()
            messages.success(self.request, message)
            return self.HttpResponse()
        return super().form_valid(form)


@method_decorator(login_required, name="dispatch")
class RestrictedDaysDetailView(HorillaDetailedView):
    """
    detail view of page
    """

    def __init__(self, **kwargs: Any) -> None:
        super().__init__(**kwargs)
        self.body = [
            (_("Start Date"), "start_date"),
            (_("End date"), "end_date"),
            (_("Department"), "department"),
            (_("Job Position"), "job_position_col"),
            (_("Description"), "description"),
        ]

    action_method = "detail_action"

    model = RestrictLeave
    title = _("Details")
    header = {
        "title": "title",
        "subtitle": "",
        "avatar": "get_avatar",
    }
