// Feature: snowui-dashboard-redesign, Property 3: Breadcrumb derivation from pathname
// **Validates: Requirements 2.1**

import { describe, it, expect } from 'vitest';
import * as fc from 'fast-check';
import { buildBreadcrumbs } from '@/components/layout/BreadcrumbBar';
import { navItems, type NavItem } from '@/lib/constants/navigation';

describe('Property 3: Breadcrumb derivation from pathname', () => {
  it('for any valid dashboard pathname, breadcrumbs start with "Dashboards"', () => {
    fc.assert(
      fc.property(
        fc.constantFrom(...navItems),
        (navItem) => {
          const breadcrumbs = buildBreadcrumbs(navItem.href, [...navItems]);

          // First breadcrumb is always "Dashboards"
          expect(breadcrumbs.length).toBeGreaterThanOrEqual(1);
          expect(breadcrumbs[0].label).toBe('Dashboards');
          expect(breadcrumbs[0].href).toBe('/overview');
        },
      ),
      { numRuns: 100 },
    );
  });

  it('for pathnames matching a nav item, the last breadcrumb label matches the nav item label', () => {
    fc.assert(
      fc.property(
        fc.constantFrom(...navItems),
        (navItem) => {
          const breadcrumbs = buildBreadcrumbs(navItem.href, [...navItems]);

          // Last breadcrumb should match the nav item label
          const lastBreadcrumb = breadcrumbs[breadcrumbs.length - 1];
          expect(lastBreadcrumb.label).toBe(navItem.label);
          expect(lastBreadcrumb.href).toBe(navItem.href);
        },
      ),
      { numRuns: 100 },
    );
  });

  it('for unknown pathnames, breadcrumbs still start with "Dashboards" and fallback to capitalized segment', () => {
    fc.assert(
      fc.property(
        fc.stringMatching(/^[a-z]{3,12}$/),
        (segment) => {
          // Ensure it doesn't match any nav item
          const pathname = `/${segment}-unknown`;
          const matchesNavItem = navItems.some((item) => item.href === pathname);
          fc.pre(!matchesNavItem);

          const breadcrumbs = buildBreadcrumbs(pathname, [...navItems]);

          // First breadcrumb is always "Dashboards"
          expect(breadcrumbs[0].label).toBe('Dashboards');

          // Last breadcrumb is the capitalized segment (fallback)
          const lastBreadcrumb = breadcrumbs[breadcrumbs.length - 1];
          const expectedLabel = (segment + '-unknown').charAt(0).toUpperCase() + (segment + '-unknown').slice(1);
          expect(lastBreadcrumb.label).toBe(expectedLabel);
        },
      ),
      { numRuns: 100 },
    );
  });
});
