export type NavItem = {
  to: string;
  label: string;
  icon: string;
  permission: string;
  roles: string[];
  featureKey?: string;
  platformFeature?: string;
  platformSupport?: boolean;
};

const platformSupportRoles = ['superadmin', 'admin', 'support'];

export function canAccessPlatformHelp(roles: string[], portal: string): boolean {
  if (portal !== 'superadmin') return false;
  return roles.some((role) => platformSupportRoles.includes(role));
}

export const superadminNavDefinitions: NavItem[] = [
  { to: '/dashboard', label: 'Dashboard', icon: 'dashboard', permission: 'dashboard', roles: ['superadmin', 'admin', 'support'] },
  { to: '/superadmin/accounts', label: 'Accounts', icon: 'accounts', permission: 'dashboard', platformFeature: 'platform_accounts', roles: ['superadmin', 'admin'] },
  { to: '/superadmin/reports', label: 'Reports', icon: 'reports', permission: 'dashboard', platformFeature: 'platform_reports', roles: ['superadmin', 'admin'] },
  { to: '/superadmin/roles', label: 'Roles', icon: 'roles', permission: 'dashboard', platformFeature: 'platform_roles', roles: ['superadmin'] },
  { to: '/superadmin/enum-options', label: 'Enum Options', icon: 'settings', permission: 'dashboard', platformFeature: 'platform_enum_options', roles: ['superadmin'] },
  { to: '/superadmin/feature-settings', label: 'Features Settings', icon: 'features', permission: 'dashboard', platformFeature: 'platform_feature_settings', roles: ['superadmin'] },
  { to: '/superadmin/captcha-settings', label: 'Captcha Settings', icon: 'settings', permission: 'dashboard', platformFeature: 'platform_captcha', roles: ['superadmin'] },
  { to: '/superadmin/branding-settings', label: 'App Branding', icon: 'settings', permission: 'dashboard', platformFeature: 'platform_branding', roles: ['superadmin'] },
  { to: '/superadmin/contact-settings', label: 'Contact Info', icon: 'settings', permission: 'dashboard', platformFeature: 'platform_contact', roles: ['superadmin'] },
  { to: '/superadmin/legal-pages', label: 'Legal Pages', icon: 'documentation', permission: 'dashboard', platformFeature: 'platform_legal_pages', roles: ['superadmin'] },
  { to: '/superadmin/partners', label: 'Partners', icon: 'accounts', permission: 'dashboard', platformFeature: 'platform_partners', roles: ['superadmin'] },
  { to: '/superadmin/backups', label: 'Backup / Restore', icon: 'backup', permission: 'dashboard', platformFeature: 'platform_backups', roles: ['superadmin'] },
  { to: '/superadmin/users', label: 'Users', icon: 'users', permission: 'dashboard', platformFeature: 'platform_users', roles: ['superadmin'] },
  { to: '/superadmin/guides', label: 'Guide Pages', icon: 'documentation', permission: 'dashboard', platformFeature: 'platform_guides', roles: ['superadmin'] },
  { to: '/superadmin/blog', label: 'Blog Posts', icon: 'blog', permission: 'dashboard', platformFeature: 'platform_blog', roles: ['superadmin'] },
  { to: '/superadmin/faq', label: 'FAQ Pages', icon: 'faq', permission: 'dashboard', platformFeature: 'platform_faq', roles: ['superadmin'] },
  { to: '/guide', label: 'Guides', icon: 'help', permission: 'dashboard', roles: ['superadmin', 'admin', 'support'] },
  { to: '/faq', label: 'FAQ', icon: 'faq', permission: 'dashboard', roles: ['superadmin', 'admin', 'support'] },
  { to: '/superadmin/help', label: 'Help/Support', icon: 'help', permission: 'dashboard', platformFeature: 'platform_help', roles: ['superadmin', 'admin', 'support'], platformSupport: true },
];

export const clinicNavDefinitions: NavItem[] = [
  { to: '/dashboard', label: 'Dashboard', icon: 'dashboard', permission: 'dashboard', roles: ['owner', 'staff', 'doctor', 'customer'] },
  { to: '/calendar', label: 'Calendar', icon: 'calendar', permission: 'calendar', featureKey: 'calendar', roles: ['owner', 'staff', 'doctor', 'customer'] },
  { to: '/consultations', label: 'Consultations', icon: 'consultations', permission: 'consultations', featureKey: 'consultations', roles: ['owner', 'staff', 'doctor'] },
  { to: '/ask-dr-ai', label: 'Ask Dr. Ai', icon: 'ai', permission: 'consultations', featureKey: 'consultations', roles: ['owner', 'staff', 'doctor'] },
  { to: '/resources/customers', label: 'Customers', icon: 'customers', permission: 'customers', featureKey: 'customers', roles: ['owner', 'staff'] },
  { to: '/resources/patients', label: 'Patients', icon: 'patients', permission: 'patients', featureKey: 'patients', roles: ['owner', 'staff', 'doctor', 'customer'] },
  { to: '/resources/staff', label: 'Staff', icon: 'staff', permission: 'staff', featureKey: 'staff', roles: ['owner'] },
  { to: '/resources/services', label: 'Services/Products', icon: 'services', permission: 'services', featureKey: 'services', roles: ['owner', 'staff', 'doctor'] },
  { to: '/resources/diagnoses', label: 'Diagnoses', icon: 'diagnoses', permission: 'diagnoses', featureKey: 'diagnoses', roles: ['owner', 'staff', 'doctor', 'customer'] },
  { to: '/resources/prescriptions', label: 'Prescriptions', icon: 'prescriptions', permission: 'prescriptions', featureKey: 'prescriptions', roles: ['owner', 'staff', 'doctor', 'customer'] },
  { to: '/resources/invoices', label: 'Payments and Invoices', icon: 'payments', permission: 'payments', featureKey: 'payments', roles: ['owner', 'customer'] },
  { to: '/pos', label: 'POS Register', icon: 'payments', permission: 'pos', featureKey: 'pos', roles: ['owner', 'staff'] },
  { to: '/inventory', label: 'Inventory', icon: 'services', permission: 'pos', featureKey: 'pos', roles: ['owner', 'staff'] },
  { to: '/reports', label: 'Reports', icon: 'reports', permission: 'reports', featureKey: 'reports', roles: ['owner', 'staff', 'doctor', 'customer'] },
  { to: '/resources/branches', label: 'Clinic Branches', icon: 'branches', permission: 'settings', featureKey: 'branches', roles: ['owner'] },
  { to: '/resources/widget-settings', label: 'Widget Settings', icon: 'widget', permission: 'settings', featureKey: 'widget_settings', roles: ['owner'] },
  { to: '/resources/notification-settings', label: 'Notifications', icon: 'notifications', permission: 'settings', featureKey: 'notifications', roles: ['owner'] },
  { to: '/settings', label: 'Settings', icon: 'settings', permission: 'settings', featureKey: 'settings', roles: ['owner'] },
  { to: '/customer/booking', label: 'Book Appointment', icon: 'calendar', permission: 'dashboard', featureKey: 'customer_booking', roles: ['customer'] },
  { to: '/guide', label: 'Guides', icon: 'help', permission: 'dashboard', roles: ['owner', 'staff', 'doctor', 'customer'] },
  { to: '/faq', label: 'FAQ', icon: 'faq', permission: 'dashboard', roles: ['owner', 'staff', 'doctor', 'customer'] },
  { to: '/help-support', label: 'Help/Support', icon: 'help', permission: 'dashboard', roles: ['owner', 'staff', 'doctor', 'customer'] },
];

function isPlatformFeatureEnabled(
  featureKey: string | undefined,
  platformFeatures: Record<string, boolean>,
): boolean {
  if (!featureKey) return true;
  return platformFeatures[featureKey] !== false;
}

function canAccessNavItem(
  item: NavItem,
  role: string,
  permissions: string[],
  platformFeatures: Record<string, boolean>,
): boolean {
  if (!item.roles.includes(role)) return false;
  if (item.platformFeature) {
    if (!isPlatformFeatureEnabled(item.platformFeature, platformFeatures)) return false;
    if (role === 'superadmin') return true;
    return permissions.includes(item.platformFeature);
  }
  if (role === 'owner' || role === 'superadmin') return true;
  return permissions.includes(item.permission);
}

export function navItemsForRole(
  role: string,
  permissions: string[] = [],
  roleSlugs: string[] = [],
  accountFeatures: Record<string, boolean> = {},
  platformFeatures: Record<string, boolean> = {},
): NavItem[] {
  const definitions = ['superadmin', 'admin', 'support'].includes(role)
    ? superadminNavDefinitions
    : clinicNavDefinitions;

  return definitions.filter((item) => {
    if (item.featureKey && accountFeatures[item.featureKey] === false) return false;
    if (item.platformSupport) {
      return (
        canAccessPlatformHelp(roleSlugs.length ? roleSlugs : [role], role) &&
        canAccessNavItem(item, role, permissions, platformFeatures)
      );
    }
    return canAccessNavItem(item, role, permissions, platformFeatures);
  });
}

export function firstEnabledRoute(
  accountFeatures: Record<string, boolean>,
  role: string,
  permissions: string[],
  subscriptionRestricted = false,
): string {
  if (['superadmin', 'admin', 'support'].includes(role)) return '/dashboard';

  const items = navItemsForRole(role, permissions, [], accountFeatures, {});

  if (subscriptionRestricted) {
    if (role === 'owner') return '/settings';
    const exempt = items.find((item) =>
      ['/guide', '/faq', '/blog', '/help-support'].some(
        (prefix) => item.to === prefix || item.to.startsWith(`${prefix}/`),
      ),
    );
    return exempt?.to || '/guide';
  }

  return items[0]?.to || '/profile';
}
