import type { LucideIcon } from 'lucide-react';

import { ICON_REGISTRY } from '@/config/icons';
import type { Features } from '@/types';

export interface NavItem {
  href: string;
  label: string;
  icon: LucideIcon;
  shortcut?: string;
  featureFlag?: keyof Features;
  badge?: number;
  disabled?: boolean;
  disabledTooltip?: string;
}

export interface NavGroup {
  label: string;
  items: NavItem[];
}

export const navigationGroups: NavGroup[] = [
  {
    label: 'Main',
    items: [
      { href: '/dashboard', label: 'Dashboard', icon: ICON_REGISTRY.dashboard, shortcut: 'G D' },
      { href: '/portfolio', label: 'Portfolio', icon: ICON_REGISTRY.portfolio, shortcut: 'G O' },
      { href: '/profile', label: 'Profile', icon: ICON_REGISTRY.profile, shortcut: 'G P' },
    ],
  },
  {
    label: 'Community',
    items: [
      {
        href: '/feature-requests',
        label: 'Feature Requests',
        icon: ICON_REGISTRY.featureRequests,
        shortcut: 'G F',
      },
    ],
  },
  {
    label: 'Settings',
    items: [
      {
        href: '/settings/tokens',
        label: 'API Tokens',
        icon: ICON_REGISTRY.apiTokens,
        shortcut: 'G T',
        featureFlag: 'apiTokens',
      },
      {
        href: '/settings/security',
        label: 'Security',
        icon: ICON_REGISTRY.security,
        shortcut: 'G S',
        featureFlag: 'twoFactor',
      },
      {
        href: '/settings/webhooks',
        label: 'Webhooks',
        icon: ICON_REGISTRY.webhooks,
        shortcut: 'G W',
        featureFlag: 'webhooks',
      },
      {
        href: '/billing',
        label: 'Billing',
        icon: ICON_REGISTRY.billing,
        shortcut: 'G B',
        featureFlag: 'billing',
      },
    ],
  },
];

export function getVisibleNavItems(features: Features): NavItem[] {
  return navigationGroups
    .flatMap((g) => g.items)
    .filter((item) => !item.featureFlag || features[item.featureFlag]);
}

export function getVisibleGroups(features: Features): NavGroup[] {
  return navigationGroups
    .map((group) => ({
      ...group,
      items: group.items.filter((item) => !item.featureFlag || features[item.featureFlag]),
    }))
    .filter((group) => group.items.length > 0);
}
