"""
Permission-driven internal sidebar sections for the unified cockpit.

Uses existing marketplace permission helpers and contract access patterns.
Avoid hardcoding role checks in templates — visibility is resolved here.
"""
from __future__ import annotations

from dataclasses import dataclass
from typing import Any

from django.urls import reverse

from contract.access import can_access_contract_dashboard, has_explicit_contract_dashboard_permission
from contract.services.permission_resolution import show_contract_workspace_panel
from contract.models import User
from market.models import SellerProfile
from market.services import (
    PERM_MARKET_ADMIN_DASHBOARD,
    PERM_MARKET_CATEGORY_MANAGE,
    PERM_MARKET_COMMISSION_MANAGE,
    PERM_MARKET_ORDER_PROCESS_ASSIGNED,
    PERM_MARKET_PRODUCT_MODERATE,
    PERM_MARKET_SELLER_REVIEW,
    PERM_MARKET_STAFF_DASHBOARD,
    can_assign_market_order_staff,
    can_manage_all_farmer_market_listings,
    can_manage_assigned_farmer_market_listings,
    can_manage_field_officer_assignments,
    can_manage_market_products,
    can_process_assigned_market_orders,
    can_record_farmer_market_payments,
    can_register_farmer_market_farmers,
    can_view_own_market_orders,
    user_has_market_permission,
)
from market.services.access import can_manage_company, can_view_company_admin_pages, resolve_company_for_user


@dataclass(frozen=True)
class InternalNavItem:
    label: str
    url: str
    icon: str


@dataclass(frozen=True)
class InternalNavSection:
    section_id: str
    title: str
    icon: str
    items: tuple[InternalNavItem, ...]



def _user_can_open_group_contract_nav(user) -> bool:
    if not getattr(user, "is_authenticated", False):
        return False
    if getattr(user, "is_superuser", False):
        return True
    return getattr(user, "type", None) in (User.Types.FIELD_OFFICER,)


def _user_can_open_input_management(user) -> bool:
    return bool(getattr(user, "is_superuser", False))


def _user_can_open_input_shop_nav(user) -> bool:
    if not getattr(user, "is_authenticated", False):
        return False
    if getattr(user, "is_superuser", False):
        return True
    return getattr(user, "type", None) in (
        User.Types.FARMER,
        User.Types.FIELD_OFFICER,
        User.Types.ADMIN,
    )


def _user_can_manage_contract_terms(user) -> bool:
    return bool(getattr(user, "is_superuser", False))


def _user_sees_farmer_group_contract_nav(user) -> bool:
    return getattr(user, "type", None) == User.Types.FARMER


def _user_can_open_payments_nav(user) -> bool:
    if not getattr(user, "is_authenticated", False):
        return False
    if getattr(user, "is_superuser", False):
        return True
    return getattr(user, "type", None) == User.Types.FARMER


def _user_can_open_system_settings(user) -> bool:
    if getattr(user, "is_superuser", False):
        return True
    return bool(getattr(user, "has_perm", lambda *_: False)("contract.view_inputshoppickupstation"))


def build_internal_sidebar_sections(user) -> list[dict[str, Any]]:
    """
    Return serializable section dicts for templates (JSON-safe strings, no callables).
    """
    if not getattr(user, "is_authenticated", False):
        return []

    sections: list[InternalNavSection] = []

    # --- Contract workspace ---
    if can_access_contract_dashboard(user) and show_contract_workspace_panel(user):
        contract_items: list[InternalNavItem] = [
            InternalNavItem(
                label="Contracts",
                url=reverse("contract_market_place:contract_list"),
                icon="fa-file-contract",
            ),
        ]
        if _user_can_open_group_contract_nav(user):
            contract_items.append(
                InternalNavItem(
                    label="Group contracts",
                    url=reverse("contract_market_place:group_contract_list"),
                    icon="fa-file-signature",
                )
            )
        if getattr(user, "type", None) in (
            User.Types.FARMER,
            User.Types.FIELD_OFFICER,
        ) or getattr(user, "is_superuser", False):
            contract_items.append(
                InternalNavItem(
                    label="Create contract (input shop)",
                    url=reverse("contract_market_place:input_shop_contracts"),
                    icon="fa-box-open",
                )
            )
        if _user_can_manage_contract_terms(user):
            contract_items.append(
                InternalNavItem(
                    label="Contract terms",
                    url=reverse("contract_market_place:manage_contract_terms"),
                    icon="fa-file-alt",
                )
            )
        sections.append(
            InternalNavSection(
                section_id="contract_workspace",
                title="Contract workspace",
                icon="fa-file-contract",
                items=tuple(contract_items),
            )
        )

    if _user_sees_farmer_group_contract_nav(user):
        sections.append(
            InternalNavSection(
                section_id="farmer_group_contracts",
                title="Group contracts",
                icon="fa-users-cog",
                items=(
                    InternalNavItem(
                        label="My groups",
                        url=reverse("contract_market_place:my_groups"),
                        icon="fa-users",
                    ),
                    InternalNavItem(
                        label="Group contracts",
                        url=reverse("contract_market_place:group_contract_list"),
                        icon="fa-file-contract",
                    ),
                ),
            )
        )

    # --- Input management (superuser) ---
    if _user_can_open_input_management(user):
        input_items = [
            InternalNavItem(
                label="Inputs",
                url=reverse("contract_market_place:input_list"),
                icon="fa-box-open",
            ),
        ]
        if getattr(user, "is_superuser", False) or (
            hasattr(user, "has_perm_code") and user.has_perm_code(PERM_MARKET_COMMISSION_MANAGE)
        ):
            input_items.append(
                InternalNavItem(
                    label="Rates and market fees",
                    url=reverse("contract_market_place:interest_rate_list"),
                    icon="fa-percentage",
                )
            )
        sections.append(
            InternalNavSection(
                section_id="input_management",
                title="Input catalog",
                icon="fa-box",
                items=tuple(input_items),
            )
        )

    # --- Input shop ---
    if _user_can_open_input_shop_nav(user):
        shop_items = [
            InternalNavItem(
                label="Visit input shop",
                url=reverse("contract_market_place:input_shop"),
                icon="fa-store",
            ),
        ]
        if getattr(user, "type", None) in (User.Types.FIELD_OFFICER, User.Types.ADMIN) or getattr(
            user, "is_superuser", False
        ):
            orders_url = (
                reverse("contract_market_place:input_shop_orders")
                if getattr(user, "type", None) == User.Types.FIELD_OFFICER
                and not getattr(user, "is_superuser", False)
                else reverse("contract_market_place:input_shop_orders_admin")
            )
            shop_items.append(
                InternalNavItem(
                    label="Input shop orders",
                    url=orders_url,
                    icon="fa-clipboard-list",
                )
            )
        sections.append(
            InternalNavSection(
                section_id="input_shop",
                title="Input shop",
                icon="fa-shopping-cart",
                items=tuple(shop_items),
            )
        )

    # --- Marketplace operations ---
    market_items: list[InternalNavItem] = []
    if can_view_own_market_orders(user):
        market_items.append(
            InternalNavItem(
                label="Buyer orders",
                url=reverse("market:buyer_orders"),
                icon="fa-bag-shopping",
            )
        )
    company_profile = resolve_company_for_user(user) if getattr(user, "is_authenticated", False) else None
    if company_profile:
        market_items.append(
            InternalNavItem(
                label="Company workspace",
                url=reverse("market:company_workspace"),
                icon="fa-building",
            )
        )
    seller_profile = None
    if getattr(user, "is_authenticated", False):
        seller_profile = SellerProfile.objects.filter(user=user).only("status").first()

    if seller_profile and not can_manage_market_products(user):
        market_items.append(
            InternalNavItem(
                label="Seller application status",
                url=reverse("market:seller_status"),
                icon="fa-id-card",
            )
        )
    elif not seller_profile and getattr(user, "type", None) in (
        User.Types.BUYER,
        User.Types.BUSINESS_PERSON,
        User.Types.FARMER,
    ):
        market_items.append(
            InternalNavItem(
                label="Become a seller",
                url=reverse("market:seller_apply"),
                icon="fa-store",
            )
        )
    if not company_profile and getattr(user, "type", None) == User.Types.BUSINESS_PERSON:
        market_items.append(
            InternalNavItem(
                label="Register company",
                url=reverse("market:company_register"),
                icon="fa-building",
            )
        )
    if user_has_market_permission(user, PERM_MARKET_ADMIN_DASHBOARD) or user_has_market_permission(user, PERM_MARKET_PRODUCT_MODERATE):
        market_items.append(
            InternalNavItem(
                label="Seller products",
                url=reverse("market:product_list"),
                icon="fa-boxes-stacked",
            )
        )
    elif can_manage_market_products(user):
        market_items.append(
            InternalNavItem(
                label="Seller products",
                url=reverse("market:seller_product_list"),
                icon="fa-boxes-stacked",
            )
        )
    if can_manage_all_farmer_market_listings(user) or can_manage_assigned_farmer_market_listings(user):
        market_items.append(
            InternalNavItem(
                label="Farmer listing queue",
                url=reverse("market:farmer_listing_approval_list"),
                icon="fa-seedling",
            )
        )
    if can_manage_all_farmer_market_listings(user) or can_manage_assigned_farmer_market_listings(user):
        market_items.append(
            InternalNavItem(
                label="Post farmer product",
                url=reverse("market:farmer_listing_create"),
                icon="fa-plus",
            )
        )
    if can_register_farmer_market_farmers(user):
        market_items.append(
            InternalNavItem(
                label="Register market farmer",
                url=reverse("market:field_officer_register_farmer"),
                icon="fa-user-plus",
            )
        )
    if can_process_assigned_market_orders(user):
        market_items.append(
            InternalNavItem(
                label="Assigned marketplace orders",
                url=reverse("market:market_staff_assigned_orders"),
                icon="fa-truck-fast",
            )
        )
    if market_items:
        sections.append(
            InternalNavSection(
                section_id="market_operations",
                title="Marketplace operations",
                icon="fa-store",
                items=tuple(market_items),
            )
        )

    if can_view_company_admin_pages(user):
        sections.append(
            InternalNavSection(
                section_id="company_administration",
                title="Company administration",
                icon="fa-building",
                items=(
                    InternalNavItem(
                        label="Companies",
                        url=reverse("market:company_admin_list"),
                        icon="fa-building",
                    ),
                    InternalNavItem(
                        label="Company approvals",
                        url=reverse("market:company_admin_approvals"),
                        icon="fa-circle-check",
                    ),
                    InternalNavItem(
                        label="Company documents",
                        url=reverse("market:company_admin_documents"),
                        icon="fa-folder-open",
                    ),
                    InternalNavItem(
                        label="Company members",
                        url=reverse("market:company_admin_members"),
                        icon="fa-users",
                    ),
                ),
            )
        )

    # --- Market admin / moderation ---
    admin_items: list[InternalNavItem] = []
    if user_has_market_permission(user, PERM_MARKET_SELLER_REVIEW):
        admin_items.append(
            InternalNavItem(
                label="Seller review queue",
                url=reverse("market:seller_review_list"),
                icon="fa-user-clock",
            )
        )
    if user_has_market_permission(user, PERM_MARKET_PRODUCT_MODERATE):
        admin_items.append(
            InternalNavItem(
                label="Product review queue",
                url=reverse("market:product_review_list"),
                icon="fa-clipboard-check",
            )
        )
    if user_has_market_permission(user, PERM_MARKET_CATEGORY_MANAGE) or getattr(user, "is_superuser", False):
        admin_items.append(
            InternalNavItem(
                label="Categories",
                url=reverse("market:category_list"),
                icon="fa-tags",
            )
        )
    if (
        user_has_market_permission(user, PERM_MARKET_ADMIN_DASHBOARD)
        or user_has_market_permission(user, PERM_MARKET_STAFF_DASHBOARD)
        or user_has_market_permission(user, PERM_MARKET_ORDER_PROCESS_ASSIGNED)
    ):
        admin_items.append(
            InternalNavItem(
                label="Buyer accounts",
                url=reverse("market:buyer_list"),
                icon="fa-users",
            )
        )
    if can_assign_market_order_staff(user):
        admin_items.append(
            InternalNavItem(
                label="Order assignment queue",
                url=reverse("market:market_admin_order_queue"),
                icon="fa-list-check",
            )
        )
    if admin_items:
        sections.append(
            InternalNavSection(
                section_id="market_admin",
                title="Moderation and approvals",
                icon="fa-gavel",
                items=tuple(admin_items),
            )
        )

    # --- Finance (contract-side market fees) ---
    if getattr(user, "is_superuser", False) or (
        hasattr(user, "has_perm_code") and user.has_perm_code(PERM_MARKET_COMMISSION_MANAGE)
    ):
        if not getattr(user, "is_superuser", False):
            sections.append(
                InternalNavSection(
                    section_id="market_fees",
                    title="Market fees",
                    icon="fa-percent",
                    items=(
                        InternalNavItem(
                            label="Manage commission",
                            url=reverse("contract_market_place:interest_rate_list"),
                            icon="fa-calendar-check",
                        ),
                    ),
                )
            )

    # --- Payments ---
    if _user_can_open_payments_nav(user):
        sections.append(
            InternalNavSection(
                section_id="finance_payments",
                title="Finance and payments",
                icon="fa-money-bill",
                items=(
                    InternalNavItem(
                        label="Payments",
                        url=reverse("payments:payment_management_list"),
                        icon="fa-money-bill-wave",
                    ),
                    InternalNavItem(
                        label="Payment reports",
                        url=reverse("payments:payment_management_list") + "?export=excel",
                        icon="fa-file-export",
                    ),
                ),
            )
        )

    # --- Reports & analytics (hub) ---
    if can_access_contract_dashboard(user):
        sections.append(
            InternalNavSection(
                section_id="reports_hub",
                title="Reports and analytics",
                icon="fa-chart-line",
                items=(
                    InternalNavItem(
                        label="Notification center",
                        url=reverse("contract_market_place:notifications_center"),
                        icon="fa-bell",
                    ),
                ),
            )
        )

    # --- System settings ---
    if _user_can_open_system_settings(user):
        sys_items: list[InternalNavItem] = []
        if getattr(user, "is_superuser", False):
            sys_items.extend(
                [
                    InternalNavItem(
                        label="Manage users",
                        url=reverse("contract_market_place:user_list") + "?type=FARMER",
                        icon="fa-tractor",
                    ),
                    InternalNavItem(
                        label="Roles and permissions",
                        url=reverse("contract_market_place:user_list") + "#roles-permissions",
                        icon="fa-user-shield",
                    ),
                    InternalNavItem(
                        label="Manage groups",
                        url=reverse("contract_market_place:my_groups"),
                        icon="fa-users",
                    ),
                    InternalNavItem(
                        label="Field officer assignment",
                        url=reverse("contract_market_place:field_officer_list"),
                        icon="fa-user-tie",
                    ),
                    InternalNavItem(
                        label="Operational settings",
                        url=reverse("contract_market_place:operational_settings"),
                        icon="fa-sliders",
                    ),
                ]
            )
        if getattr(user, "has_perm", lambda *_: False)("contract.view_inputshoppickupstation"):
            sys_items.append(
                InternalNavItem(
                    label="Pickup stations",
                    url=reverse("contract_market_place:pickup_station_list"),
                    icon="fa-map-marker-alt",
                )
            )
        if sys_items:
            sections.append(
                InternalNavSection(
                    section_id="system_settings",
                    title="System settings",
                    icon="fa-gear",
                    items=tuple(sys_items),
                )
            )
    elif can_manage_field_officer_assignments(user) and not getattr(user, "is_superuser", False):
        sections.append(
            InternalNavSection(
                section_id="field_officer_tools",
                title="Field officer assignment",
                icon="fa-user-tie",
                items=(
                    InternalNavItem(
                        label="Manage assignments",
                        url=reverse("contract_market_place:field_officer_list"),
                        icon="fa-people-arrows",
                    ),
                ),
            )
        )

    return [
        {
            "id": sec.section_id,
            "title": sec.title,
            "icon": sec.icon,
            "items": [{"label": i.label, "url": i.url, "icon": i.icon} for i in sec.items],
        }
        for sec in sections
        if sec.items
    ]
