import { Link } from '@inertiajs/react';
import {
    ArrowUpDown,
    BookOpenText,
    Building,
    ClipboardList,
    FileDigit,
    GitCompareArrows,
    HandCoins,
    History,
    LayoutGrid,
    NotebookTabs,
    Scale,
    TrendingUp,
    User,
    Users,
    Vault,
    WalletMinimal,
    Zap,
} from 'lucide-react';

import { NavMain } from '@/components/nav-main';
import { NavUser } from '@/components/nav-user';
import {
    Sidebar,
    SidebarContent,
    SidebarFooter,
    SidebarHeader,
    SidebarMenu,
    SidebarMenuButton,
    SidebarMenuItem,
} from '@/components/ui/sidebar';
import { usePermissions } from '@/hooks/use-permissions';
import { dashboard } from '@/routes';
import accounting from '@/routes/accounting';
import branches from '@/routes/branches';
import cashTransactions from '@/routes/cash-transactions';
import dailyCollection from '@/routes/daily-collection';
import dataCleansing from '@/routes/data-cleansing';
import financing from '@/routes/financing';
import members from '@/routes/members';
import savings from '@/routes/savings';
import users from '@/routes/users';
import type { NavItem } from '@/types';
import AppLogo from './app-logo';

const mainNavItems: NavItem[] = [
    {
        title: 'Dashboard',
        href: dashboard(),
        icon: LayoutGrid,
        permission: 'reports.view_dashboard',
    },
];

const trxNavItems: NavItem[] = [
    {
        title: 'Nasabah',
        href: members.index().url,
        icon: Users,
        permission: 'members.view',
    },
    {
        title: 'Simpanan',
        href: savings.index().url,
        icon: WalletMinimal,
        permission: 'savings.view',
    },
    {
        title: 'Pembiayaan',
        href: financing.index().url,
        icon: HandCoins,
        permission: 'financing.view',
    },

    {
        title: 'Penagihan Harian',
        href: dailyCollection.index().url,
        icon: ClipboardList,
        permission: 'financing.view',
    },
];

const kasNavItems: NavItem[] = [
    {
        title: 'Hitung Kas Harian',
        href: '/cash-counts/create',
        icon: Vault,
        permission: 'savings.view', // teller, manager, admin all have this
    },
    {
        title: 'Pemasukan & Pengeluaran',
        href: cashTransactions.index().url,
        icon: ArrowUpDown,
        permission: 'savings.view',
    },
    {
        title: 'History Hitung Kas',
        href: '/cash-counts',
        icon: History,
        permission: 'financing.approve', // manager, admin only
    },
];

const reportNavItems: NavItem[] = [
    {
        title: 'Akuntansi',
        href: accounting.accounts.index().url,
        icon: NotebookTabs,
        permission: 'accounting.manage_accounts',
    },
    {
        title: 'Jurnal Umum',
        href: accounting.journal().url,
        icon: BookOpenText,
        permission: 'accounting.view_journal',
    },
    {
        title: 'Neraca',
        href: accounting.reports.balanceSheet().url,
        icon: Scale,
        permission: 'reports.view_balance_sheet',
    },
    {
        title: 'Neraca Saldo',
        href: accounting.reports.trialBalance().url,
        icon: Zap,
        permission: 'reports.view_trial_balance',
    },
    {
        title: 'Laporan Laba Rugi',
        href: accounting.reports.incomeStatement().url,
        icon: FileDigit,
        permission: 'reports.view_income_statement',
    },
    {
        title: 'Performa Staff',
        href: dailyCollection.performance().url,
        icon: TrendingUp,
        permission: 'financing.approve',
    },
];

const masterNavItems: NavItem[] = [
    {
        title: 'Petugas',
        href: users.index().url,
        icon: User,
        permission: 'users.view',
    },
    {
        title: 'Kantor Cabang',
        href: branches.index().url,
        icon: Building,
        permission: 'branches.view',
    },
    {
        title: 'Data Cleansing',
        href: dataCleansing.index().url,
        icon: GitCompareArrows,
        permission: 'users.manage_roles',
    },
];

/**
 * Filter nav items based on user permissions.
 * Items without a `permission` field are always visible.
 */
function filterByPermission(
    items: NavItem[],
    can: (p: string) => boolean,
): NavItem[] {
    return items.filter((item) => !item.permission || can(item.permission));
}

export function AppSidebar() {
    const { can } = usePermissions();

    const filteredMain = filterByPermission(mainNavItems, can);
    const filteredTrx = filterByPermission(trxNavItems, can);
    const filteredKas = filterByPermission(kasNavItems, can);
    const filteredReports = filterByPermission(reportNavItems, can);
    const filteredMaster = filterByPermission(masterNavItems, can);

    return (
        <Sidebar collapsible="icon" variant="inset">
            <SidebarHeader>
                <SidebarMenu>
                    <SidebarMenuItem>
                        <SidebarMenuButton size="lg" asChild>
                            <Link href={dashboard()} prefetch>
                                <AppLogo />
                            </Link>
                        </SidebarMenuButton>
                    </SidebarMenuItem>
                </SidebarMenu>
            </SidebarHeader>

            <SidebarContent>
                {filteredMain.length > 0 && (
                    <NavMain items={filteredMain} title="Platform" />
                )}
                {filteredTrx.length > 0 && (
                    <NavMain items={filteredTrx} title="Transaksi" />
                )}
                {filteredKas.length > 0 && (
                    <NavMain items={filteredKas} title="Kas & Teller" />
                )}
                {filteredReports.length > 0 && (
                    <NavMain items={filteredReports} title="Laporan" />
                )}
                {filteredMaster.length > 0 && (
                    <NavMain items={filteredMaster} title="Master" />
                )}
            </SidebarContent>

            <SidebarFooter>
                <NavUser />
            </SidebarFooter>
        </Sidebar>
    );
}
