import { Car } from './Car';
import { RacingDomainValidationError } from '../errors/RacingDomainError';

describe('Car', () => {
  describe('create', () => {
    it('should create a car with required fields', () => {
      const car = Car.create({
        id: '1',
        name: 'Ferrari 488',
        manufacturer: 'Ferrari',
        gameId: 'iracing',
      });

      expect(car.id.toString()).toBe('1');
      expect(car.name.toString()).toBe('Ferrari 488');
      expect(car.manufacturer.toString()).toBe('Ferrari');
      expect(car.gameId.toString()).toBe('iracing');
    });

    it('should create a car with all fields', () => {
      const car = Car.create({
        id: '1',
        name: 'Ferrari 488',
        shortName: '488',
        manufacturer: 'Ferrari',
        carClass: 'gt',
        license: 'Pro',
        year: 2018,
        horsepower: 661,
        weight: 1320,
        imageUrl: 'http://example.com/car.jpg',
        gameId: 'iracing',
      });

      expect(car.id.toString()).toBe('1');
      expect(car.name.toString()).toBe('Ferrari 488');
      expect(car.shortName).toBe('488');
      expect(car.manufacturer.toString()).toBe('Ferrari');
      expect(car.carClass.toString()).toBe('gt');
      expect(car.license.toString()).toBe('Pro');
      expect(car.year.toNumber()).toBe(2018);
      expect(car.horsepower?.toNumber()).toBe(661);
      expect(car.weight?.toNumber()).toBe(1320);
      expect(car.imageUrl?.toString()).toBe('http://example.com/car.jpg');
      expect(car.gameId.toString()).toBe('iracing');
    });

    it('should use defaults for optional fields', () => {
      const car = Car.create({
        id: '1',
        name: 'Ferrari 488',
        manufacturer: 'Ferrari',
        gameId: 'iracing',
      });

      expect(car.carClass.toString()).toBe('gt');
      expect(car.license.toString()).toBe('D');
      expect(car.year.toNumber()).toBe(new Date().getFullYear());
      expect(car.shortName).toBe('Ferrari 48');
    });

    it('should throw error for invalid id', () => {
      expect(() => Car.create({
        id: '',
        name: 'Ferrari 488',
        manufacturer: 'Ferrari',
        gameId: 'iracing',
      })).toThrow(RacingDomainValidationError);
    });

    it('should throw error for invalid name', () => {
      expect(() => Car.create({
        id: '1',
        name: '',
        manufacturer: 'Ferrari',
        gameId: 'iracing',
      })).toThrow(RacingDomainValidationError);
    });

    it('should throw error for invalid manufacturer', () => {
      expect(() => Car.create({
        id: '1',
        name: 'Ferrari 488',
        manufacturer: '',
        gameId: 'iracing',
      })).toThrow(RacingDomainValidationError);
    });

    it('should throw error for invalid gameId', () => {
      expect(() => Car.create({
        id: '1',
        name: 'Ferrari 488',
        manufacturer: 'Ferrari',
        gameId: '',
      })).toThrow(RacingDomainValidationError);
    });

    it('should throw error for invalid horsepower', () => {
      expect(() => Car.create({
        id: '1',
        name: 'Ferrari 488',
        manufacturer: 'Ferrari',
        gameId: 'iracing',
        horsepower: 0,
      })).toThrow(RacingDomainValidationError);
    });

    it('should throw error for invalid weight', () => {
      expect(() => Car.create({
        id: '1',
        name: 'Ferrari 488',
        manufacturer: 'Ferrari',
        gameId: 'iracing',
        weight: -1,
      })).toThrow(RacingDomainValidationError);
    });
  });
});