import {
  computeSchoolFlags, buildNavItems,
  computeSecondaryFlags, buildSecondaryNavItems,
} from '@/lib/schoolSections';
import {
  primaryFixture, secondaryFixture, allThroughFixture, specialFixture,
} from '../support/schoolFixtures';

describe('computeSchoolFlags', () => {
  it('treats an all-through school as both primary-capable and secondary', () => {
    const f = computeSchoolFlags(allThroughFixture);
    expect(f.isAllThrough).toBe(true);
    expect(f.isSecondary).toBe(true);
    expect(f.hasKS2Results).toBe(true);
    expect(f.hasKS4Results).toBe(true);
  });

  it('classifies an ordinary primary', () => {
    const f = computeSchoolFlags(primaryFixture);
    expect(f.isPrimary).toBe(true);
    expect(f.isSecondary).toBe(false);
    expect(f.hasKS2Results).toBe(true);
    expect(f.hasKS4Results).toBe(false);
  });

  it('classifies an ordinary secondary', () => {
    const f = computeSchoolFlags(secondaryFixture);
    expect(f.isSecondary).toBe(true);
    expect(f.isAllThrough).toBe(false);
    expect(f.hasKS4Results).toBe(true);
  });

  it('suppresses the KS2 comparison for a special school', () => {
    const f = computeSchoolFlags(specialFixture);
    expect(f.isSpecial).toBe(true);
    expect(f.suppressKs2Comparison).toBe(true);
    expect(f.suppressKs4Comparison).toBe(true);
  });

  it('treats an all-zero KS2 row as a placeholder', () => {
    const f = computeSchoolFlags(specialFixture);
    expect(f.ks2Placeholder).toBe(true);
  });

  it('does not suppress comparison for an ordinary primary', () => {
    const f = computeSchoolFlags(primaryFixture);
    expect(f.isSpecial).toBe(false);
    expect(f.suppressKs2Comparison).toBe(false);
  });

  it('detects a gender split only when census counts are present', () => {
    expect(computeSchoolFlags(primaryFixture).hasGenderSplit).toBe(true);
    expect(
      computeSchoolFlags({ ...primaryFixture, census: null }).hasGenderSplit,
    ).toBe(false);
  });
});

describe('buildNavItems', () => {
  it('omits sections with no data', () => {
    const flags = computeSchoolFlags(specialFixture);
    const ids = buildNavItems(flags, {
      ofsted: null, admissions: null, yearlyDataLength: 1,
    }).map((n) => n.id);

    expect(ids).not.toContain('ofsted');
    expect(ids).not.toContain('admissions');
    expect(ids).toContain('history');
  });

  it('labels the results section by phase', () => {
    const label = (fixture: any) => {
      const flags = computeSchoolFlags(fixture);
      return buildNavItems(flags, {
        ofsted: fixture.ofsted,
        admissions: fixture.admissions,
        yearlyDataLength: fixture.yearlyData.length,
      }).find((n) => n.id === 'results')?.label;
    };

    expect(label(primaryFixture)).toBe('SATs');
    expect(label(secondaryFixture)).toBe('GCSEs');
    expect(label(allThroughFixture)).toBe('Results');
  });

  it('keeps the engagement-led ordering', () => {
    const flags = computeSchoolFlags(primaryFixture);
    const ids = buildNavItems(flags, {
      ofsted: primaryFixture.ofsted,
      admissions: primaryFixture.admissions,
      yearlyDataLength: primaryFixture.yearlyData.length,
    }).map((n) => n.id);

    expect(ids).toEqual([
      'ofsted', 'results', 'admissions', 'inclusion',
      'history', 'school-life', 'local-area', 'finances',
    ]);
  });
});

describe('computeSecondaryFlags', () => {
  it('reads results and sixth form from the secondary fixture', () => {
    const f = computeSecondaryFlags(secondaryFixture);
    expect(f.hasResults).toBe(true);
    expect(f.hasSixthForm).toBe(false);
    expect(f.hasWellbeing).toBe(true);
  });

  it('reports sixth form when GIAS flags it', () => {
    expect(computeSecondaryFlags(allThroughFixture).hasSixthForm).toBe(true);
  });

  it('suppresses the comparison for a special school', () => {
    const f = computeSecondaryFlags(specialFixture);
    expect(f.isSpecial).toBe(true);
    expect(f.suppressComparison).toBe(true);
  });

  it('does not flag Progress 8 as suspended for pre-2024/25 cohorts', () => {
    expect(computeSecondaryFlags(secondaryFixture).p8Suspended).toBe(false);
  });
});

describe('buildSecondaryNavItems', () => {
  it('uses the secondary section ids', () => {
    const flags = computeSecondaryFlags(secondaryFixture);
    const ids = buildSecondaryNavItems(flags, {
      ofsted: secondaryFixture.ofsted,
      admissions: secondaryFixture.admissions,
      yearlyDataLength: secondaryFixture.yearlyData.length,
    }).map((n) => n.id);

    expect(ids).toEqual(['ofsted', 'gcse', 'admissions', 'history', 'wellbeing', 'finances']);
  });

  it('gates History on more than one year, unlike the primary page', () => {
    const flags = computeSecondaryFlags(secondaryFixture);
    const ids = buildSecondaryNavItems(flags, {
      ofsted: null, admissions: null, yearlyDataLength: 1,
    }).map((n) => n.id);

    expect(ids).not.toContain('history');
  });
});
