"""
budget/cbv/sub_head.py
======================
CBV views for BudgetSubHead CRUD.
"""

from typing import Any

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

from budget.filters import BudgetSubHeadFilter
from budget.forms import BudgetSubHeadForm
from budget.models import BudgetSubHead
from horilla_views.cbv_methods import login_required, permission_required
from horilla_views.generic.cbv.views import (
    HorillaFormView,
    HorillaListView,
    HorillaNavView,
    TemplateView,
)


@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required("budget.view_budgetsubhead"), name="dispatch")
class BudgetSubHeadViewPage(TemplateView):
    template_name = "cbv/sub_head/sub_head_home.html"


@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required("budget.view_budgetsubhead"), name="dispatch")
class BudgetSubHeadNavView(HorillaNavView):
    def __init__(self, **kwargs: Any) -> None:
        super().__init__(**kwargs)
        self.search_url = reverse("budget-sub-head-list")
        self.search_swap_target = "#listContainer"
        self.create_attrs = (
            f'hx-get="{reverse_lazy("budget-sub-head-create")}" '
            'hx-target="#genericModalBody" '
            'data-target="#genericModal" '
            'data-toggle="oh-modal-toggle"'
        )

    nav_title = _("Budget Sub-Heads")
    filter_instance = BudgetSubHeadFilter()
    filter_body_template = "cbv/sub_head/filter.html"
    filter_form_context_name = "form"


@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required("budget.view_budgetsubhead"), name="dispatch")
class BudgetSubHeadListView(HorillaListView):
    model = BudgetSubHead
    filter_class = BudgetSubHeadFilter

    def __init__(self, **kwargs: Any) -> None:
        super().__init__(**kwargs)
        self.view_id = "budget-sub-head-container"
        self.search_url = reverse("budget-sub-head-list")

        self.actions = []
        if self.request.user.has_perm("budget.change_budgetsubhead"):
            self.actions.append(
                {
                    "action": _("Edit"),
                    "icon": "create-outline",
                    "attrs": """
                        class="oh-btn oh-btn--light-bkg w-100"
                        hx-get='{get_update_url}?instance_ids={ordered_ids}'
                        hx-target="#genericModalBody"
                        data-toggle="oh-modal-toggle"
                        data-target="#genericModal"
                    """,
                }
            )
        if self.request.user.has_perm("budget.delete_budgetsubhead"):
            self.actions.append(
                {
                    "action": _("Delete"),
                    "icon": "trash-outline",
                    "attrs": """
                        class="oh-btn oh-btn--danger-outline oh-btn--light-bkg w-100"
                        hx-get="{get_delete_url}?model=budget.BudgetSubHead&pk={pk}"
                        data-toggle="oh-modal-toggle"
                        data-target="#deleteConfirmation"
                        hx-target="#deleteConfirmationBody"
                    """,
                }
            )

    columns = [
        (_("Code"), "code"),
        (_("Head"), "head"),
        (_("Name"), "name"),
        (_("Items"), "item_count"),
        (_("Active"), "is_active"),
    ]

    sortby_mapping = [
        ("Code", "code"),
        ("Name", "name"),
        ("Head", "head__name"),
    ]

    header_attrs = {
        "code": """ style="width:160px !important" """,
        "head": """ style="width:200px !important" """,
        "item_count": """ style="width:100px !important" """,
        "is_active": """ style="width:100px !important" """,
        "action": """ style="width:160px !important" """,
    }

    row_attrs = """
        id="budgetSubHeadTr{get_delete_instance}"
    """

    def get_queryset(self, *args, **kwargs):
        qs = super().get_queryset(*args, **kwargs).select_related("head")
        head_pk = self.request.GET.get("head")
        if head_pk:
            qs = qs.filter(head_id=head_pk)
        return qs

    records_per_page = 25


@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required("budget.add_budgetsubhead"), name="dispatch")
class BudgetSubHeadFormView(HorillaFormView):
    model = BudgetSubHead
    form_class = BudgetSubHeadForm
    new_display_title = _("Add Budget Sub-Head")
    template_name = "cbv/sub_head/sub_head_form.html"

    def get_initial(self):
        initial = super().get_initial()
        head_pk = self.request.GET.get("head") or self.request.POST.get("head")
        if head_pk:
            initial["head"] = head_pk
        return initial

    def form_valid(self, form: BudgetSubHeadForm) -> HttpResponse:
        if form.is_valid():
            if form.instance.pk:
                messages.success(self.request, _("Sub-head updated."))
            else:
                messages.success(self.request, _("Sub-head created."))
            form.save()
            return self.HttpResponse()
        return super().form_valid(form)
