import { describe, it, expect } from 'vitest';
import { LeagueScoringConfig } from './LeagueScoringConfig';
import type { ChampionshipConfig } from '../types/ChampionshipConfig';
import { PointsTable } from '../value-objects/PointsTable';

const mockPointsTable = new PointsTable({ 1: 25, 2: 18, 3: 15 });

const mockChampionshipConfig: ChampionshipConfig = {
  id: 'champ1',
  name: 'Championship 1',
  type: 'driver',
  sessionTypes: ['main'],
  pointsTableBySessionType: {
    practice: mockPointsTable,
    qualifying: mockPointsTable,
    q1: mockPointsTable,
    q2: mockPointsTable,
    q3: mockPointsTable,
    sprint: mockPointsTable,
    main: mockPointsTable,
    timeTrial: mockPointsTable,
  },
  dropScorePolicy: { strategy: 'none' },
};

describe('LeagueScoringConfig', () => {
  it('should create a league scoring config', () => {
    const config = LeagueScoringConfig.create({
      seasonId: 'season1',
      championships: [mockChampionshipConfig],
    });

    expect(config.id.toString()).toBe('scoring-config-season1');
    expect(config.seasonId.toString()).toBe('season1');
    expect(config.scoringPresetId).toBeUndefined();
    expect(config.championships).toEqual([mockChampionshipConfig]);
  });

  it('should create with custom id', () => {
    const config = LeagueScoringConfig.create({
      id: 'custom-id',
      seasonId: 'season1',
      scoringPresetId: 'preset1',
      championships: [mockChampionshipConfig],
    });

    expect(config.id.toString()).toBe('custom-id');
    expect(config.scoringPresetId?.toString()).toBe('preset1');
  });

  it('should throw on invalid seasonId', () => {
    expect(() => LeagueScoringConfig.create({
      seasonId: '',
      championships: [mockChampionshipConfig],
    })).toThrow('Season ID is required');
  });

  it('should throw on empty championships', () => {
    expect(() => LeagueScoringConfig.create({
      seasonId: 'season1',
      championships: [],
    })).toThrow('At least one championship is required');
  });

  it('should create with multiple championships', () => {
    const config = LeagueScoringConfig.create({
      seasonId: 'season1',
      championships: [mockChampionshipConfig, { ...mockChampionshipConfig, id: 'champ2' }],
    });

    expect(config.championships).toHaveLength(2);
  });
});