"""
budget/cbv/head.py
==================
CBV views for BudgetHead CRUD.

Pattern (mirrors payroll/cbv/salary_structure.py):
  BudgetHeadViewPage  → TemplateView that extends index.html
  BudgetHeadNavView   → HorillaNavView (topbar with search/filter/create)
  BudgetHeadListView  → HorillaListView (records table)
  BudgetHeadFormView  → HorillaFormView (create/edit modal)
"""

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 BudgetHeadFilter
from budget.forms import BudgetHeadForm
from budget.models import BudgetHead
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_budgethead"), name="dispatch")
class BudgetHeadViewPage(TemplateView):
    """Full-page host that loads the nav + list via HTMX."""

    template_name = "cbv/head/head_home.html"


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

    nav_title = _("Budget Heads")
    filter_instance = BudgetHeadFilter()
    filter_body_template = "cbv/head/filter.html"
    filter_form_context_name = "form"


@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required("budget.view_budgethead"), name="dispatch")
class BudgetHeadListView(HorillaListView):
    model = BudgetHead
    filter_class = BudgetHeadFilter

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

        self.actions = []
        if self.request.user.has_perm("budget.change_budgethead"):
            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_budgethead"):
            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.BudgetHead&pk={pk}"
                        data-toggle="oh-modal-toggle"
                        data-target="#deleteConfirmation"
                        hx-target="#deleteConfirmationBody"
                    """,
                }
            )

    columns = [
        (_("Code"), "code"),
        (_("Name"), "name"),
        (_("Sub-Heads"), "sub_head_count"),
        (_("Active"), "is_active"),
    ]

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

    header_attrs = {
        "code": """ style="width:140px !important" """,
        "sub_head_count": """ style="width:120px !important" """,
        "is_active": """ style="width:100px !important" """,
        "action": """ style="width:160px !important" """,
    }

    row_attrs = """
        id="budgetHeadTr{get_delete_instance}"
    """

    records_per_page = 25


@method_decorator(login_required, name="dispatch")
@method_decorator(permission_required("budget.add_budgethead"), name="dispatch")
class BudgetHeadFormView(HorillaFormView):
    model = BudgetHead
    form_class = BudgetHeadForm
    new_display_title = _("Add Budget Head")
    template_name = "cbv/head/head_form.html"

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