import useTenantAccess from '@/hooks/useTenantAccess';
import { mainNavItem } from '@/types';
import {
    Activity,
    BarChart3,
    BookOpen,
    BookUser,
    Boxes,
    Building,
    Camera,
    Contact,
    Database,
    FileText,
    GraduationCap,
    HandshakeIcon,
    Home,
    Mail,
    Package,
    Percent,
    Settings,
    ShieldEllipsis,
    ShoppingCart,
    TrendingUp,
    Truck,
    User,
    UserCog,
    UserRound,
    Users,
} from 'lucide-react';
import { route as routeHelper } from 'ziggy-js';

declare function can(permission: string): number;
declare function __(key: string): string;

interface UserRole {
    id: number;
    name: string;
    slug: string;
}

// ─────────────────────────────────────────────
// 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;
    app?: string;
    module?: string;
    checkRoute?: boolean;
    checkApp?: boolean;
    checkModule?: boolean;
    permission?: string;
    requiredRoles?: string[];
    items?: MenuItemConfig[];
}

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

const GENERAL_MENU_CONFIG: MenuItemConfig[] = [
    { title: 'Dashboard', icon: Home, route: 'dashboard', checkRoute: false },
    {
        title: 'Users',
        icon: Users,
        app: 'user',
        checkApp: true,
        items: [
            { title: 'Employees',    icon: UserCog,       route: 'users.index',             module: 'user_employees',    checkModule: true, permission: 'view_employee' },
            { title: 'Partners',     icon: HandshakeIcon, route: 'users.partner.index',      module: 'user_partners',     checkModule: true, permission: 'view_partner' },
            { title: 'Teachers',     icon: GraduationCap, route: 'users.teacher.index',      module: 'user_teachers',     checkModule: true, permission: 'view_teacher' },
            { title: 'Board Members',icon: Building,      route: 'users.board-member.index', module: 'user_board_members',checkModule: true, permission: 'view_board_member' },
        ]
    },
    {
        title: 'Contacts',
        icon: BookUser,
        app: 'contact',
        checkApp: true,
        items: [
            { title: 'Supplier', icon: Truck,         route: 'contact.supplier.index', module: 'contact_suppliers', checkModule: true, permission: 'view_supplier' },
            { title: 'Customer', icon: ShoppingCart,  route: 'contact.customer.index', module: 'contact_customers', checkModule: true, permission: 'view_customer' },
            // { title: 'Parents', icon: UserRound, route: 'contact.parent.index', module: 'contact_parents', checkModule: true, permission: 'view_parent' },
        ]
    },
];

const OTHER_MENU_CONFIG: MenuItemConfig[] = [
    { title: 'Settings',   icon: Settings,       route: 'settings.company.edit', permission: 'platform_settings' },
    { title: 'Role setup', icon: ShieldEllipsis, route: 'roles.index',           permission: 'platform_view_role' },
    { title: 'Media',      icon: Camera,         route: 'media.index',           permission: 'platform_media'},
    {
        title: 'Audit', icon: FileText, permission: 'platform_audit', 
        items: [
            { title: 'Activities', icon: Activity, route: 'activity-log.index' },
            { title: 'Email',      icon: Mail,     route: 'email-log.index' },
        ],
    },
    { title: 'Backup', icon: Database, route: 'backup.index', permission: 'platform_backup', requiredRoles: ['admin', 'super-admin', 'dev'] },
];

// ─────────────────────────────────────────────
// Exports
// ─────────────────────────────────────────────

function buildMenuItems(config: MenuItemConfig[], userRoles: UserRole[]): mainNavItem[] {
    const { tenantAccess } = useTenantAccess();

    const hasAccess = (item: MenuItemConfig): boolean => {
        if (item.permission && !can(item.permission)) return false;
        if (item.requiredRoles && !item.requiredRoles.some((r: string) => userRoles.some((ur) => ur.slug === r))) return false;

        const shouldCheckApp = item.checkApp ?? !!item.app;
        if (shouldCheckApp && item.app && !tenantAccess('apps', item.app)) return false;

        const shouldCheckModule = item.checkModule ?? !!item.module;
        if (shouldCheckModule && item.module && !tenantAccess('modules', item.module)) return false;

        return true;
    };

    const result: mainNavItem[] = [];

    for (const item of config) {
        if (!hasAccess(item)) continue;

        if (item.items) {
            const children = item.items
                .filter((child: MenuItemConfig) => {
                    const shouldCheckRoute = child.checkRoute ?? true;
                    if (shouldCheckRoute && child.route && !hasRoute(child.route)) return false;
                    return hasAccess(child);
                })
                .map((child: MenuItemConfig) => ({
                    title: __(child.title),
                    icon: child.icon,
                    url: child.route ? safeRoute(child.route) : '#',
                    isActive: false,
                }));

            if (children.length > 0) {
                result.push({ title: __(item.title), icon: item.icon, isActive: false, items: children });
            }
        } else if (item.route) {
            const shouldCheckRoute = item.checkRoute ?? true;
            if (shouldCheckRoute && !hasRoute(item.route)) continue;

            result.push({ title: __(item.title), icon: item.icon, url: safeRoute(item.route), isActive: false });
        }
    }

    return result;
}

export const platformMenuItems = (userRoles: UserRole[] = []): mainNavItem[] =>
    buildMenuItems(GENERAL_MENU_CONFIG, userRoles);

export const otherMenuItems = (userRoles: UserRole[] = []): mainNavItem[] =>
    buildMenuItems(OTHER_MENU_CONFIG, userRoles);
