import { describe, it, expect } from 'vitest';
import { DriverProfileViewModel } from './DriverProfileViewModel';

const createDriverProfileDto = (): DriverProfileViewModel => ({
  currentDriver: {
    id: 'driver-1',
    name: 'Test Driver',
    country: 'DE',
    avatarUrl: 'https://example.com/avatar.jpg',
    iracingId: 'ir-123',
    joinedAt: '2024-01-01T00:00:00Z',
    rating: 2500,
    globalRank: 42,
    consistency: 88,
    bio: 'Test bio',
    totalDrivers: 1000,
  },
  stats: {
    totalRaces: 10,
    wins: 3,
    podiums: 5,
    dnfs: 1,
    avgFinish: 4.2,
    bestFinish: 1,
    worstFinish: 15,
    finishRate: 90,
    winRate: 30,
    podiumRate: 50,
    percentile: 95,
    rating: 2500,
    consistency: 88,
    overallRank: 10,
  },
  finishDistribution: {
    totalRaces: 10,
    wins: 3,
    podiums: 5,
    topTen: 8,
    dnfs: 1,
    other: 1,
  },
  teamMemberships: [
    {
      teamId: 'team-1',
      teamName: 'Test Team',
      teamTag: 'TT',
      role: 'driver',
      joinedAt: '2023-01-01T00:00:00Z',
      isCurrent: true,
    },
  ],
  socialSummary: {
    friendsCount: 5,
    friends: [
      {
        id: 'friend-1',
        name: 'Friend 1',
        country: 'US',
        avatarUrl: 'https://example.com/friend.jpg',
      },
    ],
  },
  extendedProfile: {
    socialHandles: [
      {
        platform: 'twitter',
        handle: '@test',
        url: 'https://twitter.com/test',
      },
    ],
    achievements: [
      {
        id: 'ach-1',
        title: 'Champion',
        description: 'Won a championship',
        icon: 'trophy',
        rarity: 'epic',
        earnedAt: '2024-01-10T00:00:00Z',
      },
    ],
    racingStyle: 'Aggressive',
    favoriteTrack: 'Spa',
    favoriteCar: 'F3',
    timezone: 'Europe/Berlin',
    availableHours: 'Evenings',
    lookingForTeam: false,
    openToRequests: true,
  },
});

describe('DriverProfileViewModel', () => {
  it('exposes profile sections from DTO', () => {
    const dto = createDriverProfileDto();
    const viewModel = new DriverProfileViewModel(dto);

    expect(viewModel.currentDriver).toEqual(dto.currentDriver);
    expect(viewModel.stats).toEqual(dto.stats);
    expect(viewModel.finishDistribution).toEqual(dto.finishDistribution);
    expect(viewModel.teamMemberships).toEqual(dto.teamMemberships);
    expect(viewModel.socialSummary).toEqual(dto.socialSummary);
    expect(viewModel.extendedProfile).toEqual(dto.extendedProfile);
  });

  it('supports nullable sections', () => {
    const dto: DriverProfileViewModel = {
      ...createDriverProfileDto(),
      currentDriver: null,
      stats: null,
      finishDistribution: null,
      extendedProfile: null,
    };

    const viewModel = new DriverProfileViewModel(dto);

    expect(viewModel.currentDriver).toBeNull();
    expect(viewModel.stats).toBeNull();
    expect(viewModel.finishDistribution).toBeNull();
    expect(viewModel.extendedProfile).toBeNull();
  });

  it('returns original DTO from toDTO', () => {
    const dto = createDriverProfileDto();
    const viewModel = new DriverProfileViewModel(dto);

    expect(viewModel.toDTO()).toBe(dto);
  });
});
