import { describe, expect, it } from 'vitest';
import type { CrossProjectDependency } from '@/features/projects/types/project.types';
import {
  analyzePortfolioDependencies,
  classifyDependencyRisk,
  filterDependenciesByStatus,
} from '@/features/projects/utils/portfolioDependencyAnalytics';

function dep(overrides: Partial<CrossProjectDependency> = {}): CrossProjectDependency {
  return {
    id: '1',
    source_project_id: 'a',
    source_project_name: 'Alpha',
    source_item_type: 'project',
    source_item_id: 'a',
    target_project_id: 'b',
    target_project_name: 'Beta',
    target_item_type: 'project',
    target_item_id: 'b',
    dependency_type: 'FS',
    status: 'open',
    due_date: null,
    owner_id: null,
    notes: null,
    ...overrides,
  };
}

describe('portfolioDependencyAnalytics', () => {
  it('classifies overdue and due-soon risks', () => {
    const today = new Date('2026-06-07');
    expect(classifyDependencyRisk(dep({ status: 'resolved' }), today)).toBe('resolved');
    expect(classifyDependencyRisk(dep({ due_date: '2026-06-01' }), today)).toBe('overdue');
    expect(classifyDependencyRisk(dep({ due_date: '2026-06-10' }), today)).toBe('due_soon');
    expect(classifyDependencyRisk(dep(), today)).toBe('open');
  });

  it('aggregates exposure and attention items', () => {
    const analytics = analyzePortfolioDependencies([
      dep({ id: '1', due_date: '2026-06-01', notes: 'Auth blocker' }),
      dep({
        id: '2',
        source_project_id: 'c',
        source_project_name: 'Gamma',
        target_project_id: 'a',
        status: 'resolved',
      }),
    ]);

    expect(analytics.total).toBe(2);
    expect(analytics.open).toBe(1);
    expect(analytics.resolved).toBe(1);
    expect(analytics.overdue).toBe(1);
    expect(analytics.uniqueProjects).toBe(3);
    expect(analytics.projectExposure[0].projectName).toBe('Alpha');
    expect(analytics.attentionItems[0].id).toBe('1');
  });

  it('filters by status', () => {
    const items = [dep({ status: 'open' }), dep({ id: '2', status: 'resolved' })];
    expect(filterDependenciesByStatus(items, 'open')).toHaveLength(1);
    expect(filterDependenciesByStatus(items, 'resolved')).toHaveLength(1);
    expect(filterDependenciesByStatus(items, 'all')).toHaveLength(2);
  });
});
