// src/config/app-menu.ts

import useTenantAccess from '@/hooks/useTenantAccess';
import { mainNavItem } from '@/types';
import {
    ArrowLeftRight,
    Award,
    BadgePercent,
    Blocks,
    BookOpen,
    BookOpenCheck,
    Boxes,
    Calendar,
    CalendarClock,
    CalendarRange,
    ChartBarStacked,
    CircleDollarSign,
    CreditCard,
    Crown,
    CrownIcon,
    DollarSign,
    FileInput,
    Globe,
    History,
    Image,
    Layers,
    LayoutDashboard,
    Library,
    List,
    Menu,
    Network,
    NotebookPen,
    Package,
    Palette,
    Printer,
    School,
    Settings,
    ShoppingBasket,
    ShoppingCart,
    SlidersHorizontal,
    StickyNote,
    Store,
    Trello,
    Truck,
    Undo,
    UserPlus,
    Users,
} from 'lucide-react';
import { route as routeHelper } from 'ziggy-js';

// Globally injected helpers
declare function __(key: string): string;
declare function can(permission: string): number;

// ─────────────────────────────────────────────
// Helpers
// ─────────────────────────────────────────────

const hasRoute = (name: string): boolean => {
    try {
        routeHelper(name);
        return true;
    } catch {
        return false;
    }
};

const safeRoute = (name: string, fallback = '#'): string => {
    try {
        return routeHelper(name);
    } catch {
        return fallback;
    }
};

// ─────────────────────────────────────────────
// Types
// ─────────────────────────────────────────────

interface MenuItemConfig {
    title: string;
    icon: any;
    route?: string;
    module?: string;
    checkRoute?: boolean; // default: true if route exists
    checkModule?: boolean; // default: false
    permission?: string;
}

interface MenuSectionConfig {
    title: string;
    icon: any;
    app?: string;
    checkApp?: boolean; // default: true if app is set
    items: MenuItemConfig[];
}

// ─────────────────────────────────────────────
// MENU CONFIGURATION
// ─────────────────────────────────────────────

const MENU_CONFIG: MenuSectionConfig[] = [
    {
        title: 'Product',
        icon: Package,
        app: 'product',
        checkApp: true,
        items: [
            {
                title: 'Dashboard',
                icon: LayoutDashboard,
                route: 'products.dashboard.index',
                checkRoute: false,
                permission: 'platform_product_dashboard',
            },
            {
                title: 'Product lists',
                icon: ShoppingBasket,
                route: 'product.index',
                module: 'product_product',
                checkModule: true,
                permission: 'view_product',
            },
            {
                title: 'Category',
                icon: ChartBarStacked,
                route: 'product-category.index',
                module: 'product_category',
                checkModule: true,
                permission: 'view_product_category',
            },
            {
                title: 'Brand',
                icon: Trello,
                route: 'product-brand.index',
                module: 'product_brand',
                checkModule: true,
                permission: 'view_product_brand',
            },
            {
                title: 'Variants',
                icon: Palette,
                route: 'product-variant.index',
                module: 'product_variant',
                checkModule: true,
                permission: 'view_product_variant',
            },
            { title: 'Collections', icon: Layers, route: 'product-collection.index', module: 'product_collection', checkModule: false },
            { title: 'Print Barcode', icon: Printer, route: 'products.barcodes.index', module: 'product_barcode', checkModule: false },
            {
                title: 'Settings',
                icon: Network,
                route: 'product-unit.index',
                module: 'product_setting',
                checkRoute: false,
                permission: 'platform_product_settings',
            },
        ],
    },
    {
        title: 'Purchase',
        icon: ShoppingCart,
        app: 'purchase',
        checkApp: true,
        items: [
            {
                title: 'Dashboard',
                icon: LayoutDashboard,
                route: 'purchase.dashboard.index',
                checkRoute: false,
                permission: 'platform_purchase_dashboard',
            },
            {
                title: 'Purchase Order',
                icon: Package,
                route: 'purchase.purchase.index',
                module: 'purchase_purchase',
                checkModule: true,
                checkRoute: true,
                permission: 'view_purchase',
            },
            {
                title: 'Purchase Return',
                icon: Undo,
                route: 'purchase.return.index',
                module: 'purchase_return',
                checkModule: true,
                checkRoute: true,
                permission: 'view_purchase_return',
            },
            { title: 'Settings', icon: Settings, route: 'purchase.settings.index', checkRoute: false, permission: 'platform_purchase_settings' },
        ],
    },
    {
        title: 'Sales',
        icon: DollarSign,
        app: 'sales',
        checkApp: true,
        items: [
            { title: 'Dashboard', icon: LayoutDashboard, route: 'sales.dashboard.index', checkRoute: false, permission: 'platform_sales_dashboard' },
            {
                title: 'Orders',
                icon: Package,
                route: 'order.product.index',
                module: 'sales_orders',
                checkModule: true,
                checkRoute: false,
                permission: 'view_order',
            },
            {
                title: 'Carts',
                icon: ShoppingCart,
                route: 'product-cart.index',
                module: 'sales_carts',
                checkModule: true,
                checkRoute: false,
                permission: 'view_cart',
            },
            {
                title: 'Payments',
                icon: CircleDollarSign,
                route: 'payment.index',
                module: 'sales_payments',
                checkModule: true,
                checkRoute: false,
                permission: 'view_payment',
            },
            {
                title: 'Sales Return',
                icon: Undo,
                route: 'sales-return.index',
                module: 'sales_return',
                checkModule: true,
                checkRoute: false,
                permission: 'view_sales_return',
            },
            {
                title: 'Credit Notes',
                icon: CreditCard,
                route: 'credit-notes.index',
                module: 'credit_notes',
                checkModule: true,
                checkRoute: false,
                permission: 'view_credit_note',
            },
            { title: 'Settings', icon: Settings, route: 'sales.settings.index', checkRoute: false, permission: 'platform_sales_settings' },
        ],
    },
    {
        title: 'Delivery',
        icon: Truck,
        app: 'deliveries',
        checkApp: false,
        items: [
            {
                title: 'Providers',
                icon: Settings,
                route: 'delivery.providers.index',
                checkRoute: false,
                permission: 'view_delivery',
            },
            {
                title: 'Settings',
                icon: SlidersHorizontal,
                route: 'delivery.settings.edit',
                checkRoute: false,
                permission: 'view_delivery',
            },
        ],
    },
    {
        title: 'Inventory',
        icon: Boxes,
        app: 'inventory',
        checkApp: true,
        items: [
            {
                title: 'Dashboard',
                icon: LayoutDashboard,
                route: 'inventory.dashboard.index',
                checkRoute: false,
                permission: 'platform_inventory_dashboard',
            },
            {
                title: 'Inventory List',
                icon: List,
                route: 'inventory.list.index',
                module: 'inventory_list',
                checkModule: true,
                checkRoute: false,
                permission: 'view_inventory',
            },
            {
                title: 'Stock Adjust',
                icon: SlidersHorizontal,
                route: 'inventory.stock-adjust.index',
                module: 'inventory_stock_adjust',
                checkModule: true,
                checkRoute: false,
                permission: 'view_stock_adjust',
            },
            {
                title: 'Stock Transfer',
                icon: ArrowLeftRight,
                route: 'inventory.stock-transfer.index',
                module: 'inventory_stock_transfer',
                checkModule: true,
                checkRoute: false,
                permission: 'view_stock_transfer',
            },
            {
                title: 'Stock History',
                icon: History,
                route: 'inventory.stock-history.index',
                module: 'inventory_stock_history',
                checkModule: true,
                checkRoute: false,
                permission: 'view_stock_history',
            },
            { title: 'Settings', icon: Settings, route: 'inventory.settings.index', checkRoute: false, permission: 'platform_inventory_settings' },
        ],
    },
    {
        title: 'Promotion',
        icon: BadgePercent,
        app: 'promotion',
        checkApp: true,
        items: [
            {
                title: 'Dashboard',
                icon: LayoutDashboard,
                route: 'offers.dashboard.index',
                checkRoute: false,
                permission: 'platform_promotion_dashboard',
            },
            {
                title: 'Offers',
                icon: Package,
                route: 'offer.index',
                module: 'promotion_offer',
                checkModule: true,
                checkRoute: false,
                permission: 'view_offer',
            },
            {
                title: 'Coupons',
                icon: CircleDollarSign,
                route: 'coupon.index',
                module: 'promotion_coupon',
                checkModule: true,
                checkRoute: false,
                permission: 'view_coupon',
            },
            {
                title: 'Flash Sale',
                icon: ShoppingCart,
                route: 'flash-sale.index',
                module: 'promotion_flash_sale',
                checkModule: true,
                checkRoute: false,
                permission: 'view_flash_sale',
            },
            { title: 'Settings', icon: Settings, route: 'promotion.settings.index', checkRoute: false, permission: 'platform_promotion_settings' },
        ],
    },
    {
        title: 'Ecommerce',
        icon: Store,
        app: 'ecommerce',
        checkApp: true,
        items: [
            {
                title: 'Page',
                icon: StickyNote,
                route: 'ecommerce.page.index',
                module: 'ecommerce_pages',
                checkModule: true,
                checkRoute: false,
                permission: 'view_ecommerce_page',
            },
            {
                title: 'Blog',
                icon: Blocks,
                route: 'ecommerce.blog.index',
                module: 'ecommerce_blogs',
                checkModule: true,
                checkRoute: false,
                permission: 'view_ecommerce_blog',
            },
            {
                title: 'Promotion Banner',
                icon: Blocks,
                route: 'promotion.banner.home',
                module: 'ecommerce_promotion_banner',
                checkModule: true,
                checkRoute: false,
                permission: 'view_promotion_banner',
            },
            { title: 'Settings', icon: Blocks, route: 'ecommerce.basic.settings', checkRoute: false, permission: 'platform_ecommerce_settings' },
        ],
    },
    {
        title: 'Academic',
        icon: BookOpenCheck,
        app: 'academic',
        checkApp: true,
        items: [
            {
                title: 'Dashboard',
                icon: LayoutDashboard,
                route: 'academic.dashboard.index',
                checkRoute: false,
                permission: 'platform_academic_dashboard',
            },
            {
                title: 'Programs',
                icon: School,
                route: 'academic.program.index',
                module: 'academic_program',
                checkModule: true,
                permission: 'view_program',
            },
            {
                title: 'Class',
                icon: Users,
                route: 'academic.classes.index',
                module: 'academic_class',
                checkModule: true,
                permission: 'view_institute_class',
            },
            {
                title: 'Academic Year',
                icon: CalendarRange,
                route: 'academic-year.index',
                module: 'academic_year',
                checkModule: true,
                permission: 'view_academic_year',
            },
            {
                title: 'Section',
                icon: Users,
                route: 'academic-section.index',
                module: 'academic_section',
                checkModule: true,
                permission: 'view_academic_section',
            },
            {
                title: 'Curriculum',
                icon: Library,
                route: 'curriculum.index',
                module: 'academic_curriculum',
                checkModule: true,
                permission: 'view_curriculum',
            },
            {
                title: 'Routine',
                icon: CalendarClock,
                route: 'routine.index',
                module: 'academic_routine',
                checkModule: true,
                permission: 'view_routine',
            },
            {
                title: 'Syllabus',
                icon: BookOpenCheck,
                route: 'syllabus.index',
                module: 'academic_syllabus',
                checkModule: true,
                permission: 'view_syllabus',
            },
            {
                title: 'Calendar',
                icon: Calendar,
                route: 'academic-calendar.index',
                module: 'academic_calendar',
                checkModule: true,
                permission: 'view_academic_calendar',
            },
            {
                title: 'Admission Forms',
                icon: FileInput,
                route: 'admission-form.index',
                module: 'academic_admission_form',
                checkModule: true,
                permission: 'view_admission_form',
            },
            { title: 'Subject', icon: BookOpen, route: 'subject.index', module: 'academic_subject', checkModule: true, permission: 'view_subject' },
            { title: 'Result', icon: Award, route: 'result.index', module: 'academic_result', checkModule: true, permission: 'view_result' },
            { title: 'Settings', icon: Settings, route: 'academic.basic.settings', checkRoute: false, permission: 'platform_academic_settings' },
        ],
    },
    {
        title: 'Website',
        icon: Globe,
        app: 'website',
        checkApp: true,
        items: [
            {
                title: 'Dashboard',
                icon: LayoutDashboard,
                route: 'website.dashboard.index',
                checkRoute: false,
                permission: 'platform_website_dashboard',
            },
            { title: 'Menu', icon: Menu, route: 'menu.index', module: 'website_menu', checkModule: true, permission: 'view_website_menu' },
            { title: 'Page', icon: StickyNote, route: 'page.index', module: 'website_page', checkModule: true, permission: 'view_website_page' },
            { title: 'Blog', icon: Blocks, route: 'blog.index', module: 'website_blog', checkModule: true, permission: 'view_website_blog' },
            {
                title: 'Notice Board',
                icon: NotebookPen,
                route: 'notice.index',
                module: 'website_notice',
                checkModule: true,
                permission: 'view_notice',
            },
            {
                title: 'Testimonial',
                icon: Crown,
                route: 'testimonial.index',
                module: 'website_testimonial',
                checkModule: true,
                permission: 'view_testimonial',
            },
            { title: 'Gallery', icon: Image, route: 'gallery.index', module: 'website_gallery', checkModule: true, permission: 'view_gallery' },
            {
                title: 'Achievement',
                icon: CrownIcon,
                route: 'achievement.index',
                module: 'website_achievement',
                checkModule: true,
                permission: 'view_achievement',
            },
            {
                title: 'Customer Queries',
                icon: UserPlus,
                route: 'customer-query.index',
                module: 'website_customer_query',
                checkModule: true,
                permission: 'view_customer_query',
            },
            { title: 'Settings', icon: Settings, route: 'website.basic.settings', checkRoute: false, permission: 'platform_website_settings' },
        ],
    },
];

export const appMenuItems = (applications: any): mainNavItem[] => {
    const { tenantAccess } = useTenantAccess();
    const result: mainNavItem[] = [];

    for (const section of MENU_CONFIG) {
        const shouldCheckApp = section.checkApp ?? !!section.app;

        if (shouldCheckApp && section.app) {
            const hasAppAccess = tenantAccess('apps', section.app);
            if (!hasAppAccess) {
                continue;
            } else {
            }
        }

        const children = section.items
            .filter((item) => {
                // Route check
                const shouldCheckRoute = item.checkRoute ?? !!item.route;
                if (shouldCheckRoute && item.route && !hasRoute(item.route)) {
                    return false;
                }

                // Module check
                if (item.checkModule && item.module) {
                    const hasModuleAccess = tenantAccess('modules', item.module);
                    if (!hasModuleAccess) {
                        return false;
                    }
                }

                // Permission check
                if (item.permission && !can(item.permission)) {
                    return false;
                }

                return true;
            })
            .map((item) => ({
                title: __(item.title),
                icon: item.icon,
                url: item.route ? safeRoute(item.route) : '#',
                isActive: false,
            }));

        if (children.length > 0) {
            result.push({
                title: __(section.title),
                icon: section.icon,
                isActive: false,
                items: children,
            });
        }
    }

    return result;
};
