import { describe, expect, it } from 'vitest';

import type { Features } from '@/types';

import { getVisibleAdminGroups } from './admin-navigation';

const allFeatures: Features = {
  billing: true,
  socialAuth: true,
  emailVerification: true,
  apiTokens: true,
  userSettings: true,
  notifications: true,
  onboarding: false,
  apiDocs: false,
  twoFactor: true,
  webhooks: true,
  admin: true,
};

describe('getVisibleAdminGroups', () => {
  describe('viewer role', () => {
    it('hides Features group entirely when all feature flags enabled', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'viewer');
      const featuresGroup = groups.find((g) => g.label === 'Features');
      expect(featuresGroup).toBeUndefined();
    });

    it('hides Planning group entirely', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'viewer');
      const planningGroup = groups.find((g) => g.label === 'Planning');
      expect(planningGroup).toBeUndefined();
    });

    it('hides operator-level System items (Cache, Sessions, DLQ, Circuit Breaker, Feature Flags)', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'viewer');
      const systemGroup = groups.find((g) => g.label === 'System');
      expect(systemGroup).toBeDefined();
      const hrefs = systemGroup!.items.map((i) => i.href);
      expect(hrefs).not.toContain('/admin/cache');
      expect(hrefs).not.toContain('/admin/sessions');
      expect(hrefs).not.toContain('/admin/dlq');
      expect(hrefs).not.toContain('/admin/circuit-breaker');
      expect(hrefs).not.toContain('/admin/feature-flags');
    });

    it('can still see read-only System items (Health, Config, System Info, Scheduled Tasks)', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'viewer');
      const systemGroup = groups.find((g) => g.label === 'System');
      const hrefs = systemGroup!.items.map((i) => i.href);
      expect(hrefs).toContain('/admin/health');
      expect(hrefs).toContain('/admin/config');
      expect(hrefs).toContain('/admin/system');
      expect(hrefs).toContain('/admin/scheduled-tasks');
    });

    it('can see read-only Monitoring group', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'viewer');
      const monitoringGroup = groups.find((g) => g.label === 'Monitoring');
      expect(monitoringGroup).toBeDefined();
      expect(monitoringGroup!.items.length).toBeGreaterThan(0);
    });

    it('can see read-only Analysis Data group', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'viewer');
      const group = groups.find((g) => g.label === 'Analysis Data');
      expect(group).toBeDefined();
    });

    it('can see Overview group', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'viewer');
      const overview = groups.find((g) => g.label === 'Overview');
      expect(overview).toBeDefined();
      expect(overview!.items.length).toBeGreaterThan(0);
    });
  });

  describe('operator role', () => {
    it('sees Features group', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'operator');
      const featuresGroup = groups.find((g) => g.label === 'Features');
      expect(featuresGroup).toBeDefined();
      const hrefs = featuresGroup!.items.map((i) => i.href);
      expect(hrefs).toContain('/admin/billing');
      expect(hrefs).toContain('/admin/tokens');
      expect(hrefs).toContain('/admin/social-auth');
    });

    it('sees Planning group', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'operator');
      const planningGroup = groups.find((g) => g.label === 'Planning');
      expect(planningGroup).toBeDefined();
      const hrefs = planningGroup!.items.map((i) => i.href);
      expect(hrefs).toContain('/admin/reports');
      expect(hrefs).toContain('/admin/report-templates');
      expect(hrefs).toContain('/admin/shared-report-links');
      expect(hrefs).toContain('/admin/seo-calendar');
      expect(hrefs).toContain('/admin/site-members');
    });

    it('sees all operator-level System items', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'operator');
      const systemGroup = groups.find((g) => g.label === 'System');
      const hrefs = systemGroup!.items.map((i) => i.href);
      expect(hrefs).toContain('/admin/cache');
      expect(hrefs).toContain('/admin/sessions');
      expect(hrefs).toContain('/admin/feature-flags');
      expect(hrefs).toContain('/admin/dlq');
      expect(hrefs).toContain('/admin/circuit-breaker');
    });
  });

  describe('role hierarchy ordering (>= comparison, not equality)', () => {
    it('admin role inherits all operator-level System items', () => {
      // Verifies ROLE_LEVELS uses ordered >= comparison: admin (2) >= operator (1)
      const groups = getVisibleAdminGroups(allFeatures, 'admin');
      const systemGroup = groups.find((g) => g.label === 'System');
      const hrefs = systemGroup!.items.map((i) => i.href);
      expect(hrefs).toContain('/admin/cache');
      expect(hrefs).toContain('/admin/sessions');
      expect(hrefs).toContain('/admin/feature-flags');
      expect(hrefs).toContain('/admin/dlq');
      expect(hrefs).toContain('/admin/circuit-breaker');
    });

    it('super_admin role inherits all operator-level items', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'super_admin');
      const systemGroup = groups.find((g) => g.label === 'System');
      const hrefs = systemGroup!.items.map((i) => i.href);
      expect(hrefs).toContain('/admin/cache');
      expect(hrefs).toContain('/admin/dlq');
      expect(hrefs).toContain('/admin/circuit-breaker');
    });

    it('unknown role string is treated as viewer (level 0)', () => {
      // Unknown roles default to 0 via ROLE_LEVELS fallback — same as viewer
      const groups = getVisibleAdminGroups(allFeatures, 'super_secret_role');
      const systemGroup = groups.find((g) => g.label === 'System');
      const hrefs = systemGroup!.items.map((i) => i.href);
      expect(hrefs).not.toContain('/admin/cache');
      expect(hrefs).not.toContain('/admin/dlq');
      expect(hrefs).not.toContain('/admin/circuit-breaker');
    });
  });

  describe('null/undefined role (unauthenticated or viewer-level)', () => {
    it('treats null role same as viewer — hides Features and Planning groups', () => {
      const groupsNull = getVisibleAdminGroups(allFeatures, null);
      const groupsUndefined = getVisibleAdminGroups(allFeatures, undefined);
      expect(groupsNull.find((g) => g.label === 'Features')).toBeUndefined();
      expect(groupsUndefined.find((g) => g.label === 'Features')).toBeUndefined();
      expect(groupsNull.find((g) => g.label === 'Planning')).toBeUndefined();
    });
  });

  describe('feature flag interaction', () => {
    it('hides feature-flagged items even for operator when flag is off', () => {
      const noFeatures: Features = { ...allFeatures, billing: false };
      const groups = getVisibleAdminGroups(noFeatures, 'operator');
      const featuresGroup = groups.find((g) => g.label === 'Features');
      const hrefs = featuresGroup?.items.map((i) => i.href) ?? [];
      expect(hrefs).not.toContain('/admin/billing');
    });

    it('shows feature-flagged items for operator when flag is on', () => {
      const groups = getVisibleAdminGroups(allFeatures, 'operator');
      const featuresGroup = groups.find((g) => g.label === 'Features');
      const hrefs = featuresGroup!.items.map((i) => i.href);
      expect(hrefs).toContain('/admin/webhooks');
      expect(hrefs).toContain('/admin/webhook-deliveries');
    });
  });
});
