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

describe('Track', () => {
  it('should create a track', () => {
    const track = Track.create({
      id: 'track1',
      name: 'Monza Circuit',
      shortName: 'MON',
      country: 'Italy',
      category: 'road',
      difficulty: 'advanced',
      lengthKm: 5.793,
      turns: 11,
      imageUrl: 'https://example.com/monza.jpg',
      gameId: 'game1',
    });

    expect(track.id).toBe('track1');
    expect(track.name.toString()).toBe('Monza Circuit');
    expect(track.shortName.toString()).toBe('MON');
    expect(track.country.toString()).toBe('Italy');
    expect(track.category).toBe('road');
    expect(track.difficulty).toBe('advanced');
    expect(track.lengthKm.toNumber()).toBe(5.793);
    expect(track.turns.toNumber()).toBe(11);
    expect(track.imageUrl.toString()).toBe('https://example.com/monza.jpg');
    expect(track.gameId.toString()).toBe('game1');
  });

  it('should create track with defaults', () => {
    const track = Track.create({
      id: 'track1',
      name: 'Monza Circuit',
      country: 'Italy',
      lengthKm: 5.793,
      turns: 11,
      gameId: 'game1',
    });

    expect(track.shortName.toString()).toBe('MON');
    expect(track.category).toBe('road');
    expect(track.difficulty).toBe('intermediate');
    expect(track.imageUrl.toString()).toBeUndefined();
  });

  it('should create track with generated shortName', () => {
    const track = Track.create({
      id: 'track1',
      name: 'Silverstone',
      country: 'UK',
      lengthKm: 5.891,
      turns: 18,
      gameId: 'game1',
    });

    expect(track.shortName.toString()).toBe('SIL');
  });

  it('should throw on invalid id', () => {
    expect(() => Track.create({
      id: '',
      name: 'Monza Circuit',
      country: 'Italy',
      lengthKm: 5.793,
      turns: 11,
      gameId: 'game1',
    })).toThrow('Track ID is required');
  });

  it('should throw on invalid name', () => {
    expect(() => Track.create({
      id: 'track1',
      name: '',
      country: 'Italy',
      lengthKm: 5.793,
      turns: 11,
      gameId: 'game1',
    })).toThrow('Track name cannot be empty');
  });

  it('should throw on invalid country', () => {
    expect(() => Track.create({
      id: 'track1',
      name: 'Monza Circuit',
      country: '',
      lengthKm: 5.793,
      turns: 11,
      gameId: 'game1',
    })).toThrow('Track country is required');
  });

  it('should throw on invalid lengthKm', () => {
    expect(() => Track.create({
      id: 'track1',
      name: 'Monza Circuit',
      country: 'Italy',
      lengthKm: 0,
      turns: 11,
      gameId: 'game1',
    })).toThrow('Track length must be positive');
  });

  it('should throw on negative turns', () => {
    expect(() => Track.create({
      id: 'track1',
      name: 'Monza Circuit',
      country: 'Italy',
      lengthKm: 5.793,
      turns: -1,
      gameId: 'game1',
    })).toThrow('Track turns cannot be negative');
  });

  it('should throw on invalid gameId', () => {
    expect(() => Track.create({
      id: 'track1',
      name: 'Monza Circuit',
      country: 'Italy',
      lengthKm: 5.793,
      turns: 11,
      gameId: '',
    })).toThrow('Track game ID cannot be empty');
  });

  it('should throw on empty imageUrl string', () => {
    expect(() => Track.create({
      id: 'track1',
      name: 'Monza Circuit',
      country: 'Italy',
      lengthKm: 5.793,
      turns: 11,
      imageUrl: '',
      gameId: 'game1',
    })).toThrow('Track image URL cannot be empty string');
  });
});