import { describe, it, expect } from 'vitest';
import { RaceCreationResult } from 'apps/companion/main/automation/domain/value-objects/RaceCreationResult';

describe('RaceCreationResult Value Object', () => {
  describe('create', () => {
    it('should create race creation result with all fields', () => {
      const result = RaceCreationResult.create({
        sessionId: 'test-session-123',
        price: '$10.00',
        timestamp: new Date('2025-11-25T12:00:00Z'),
      });

      expect(result.sessionId).toBe('test-session-123');
      expect(result.price).toBe('$10.00');
      expect(result.timestamp).toEqual(new Date('2025-11-25T12:00:00Z'));
    });

    it('should throw error for empty session ID', () => {
      expect(() =>
        RaceCreationResult.create({
          sessionId: '',
          price: '$10.00',
          timestamp: new Date(),
        })
      ).toThrow('Session ID cannot be empty');
    });

    it('should throw error for empty price', () => {
      expect(() =>
        RaceCreationResult.create({
          sessionId: 'test-session-123',
          price: '',
          timestamp: new Date(),
        })
      ).toThrow('Price cannot be empty');
    });
  });

  describe('equals', () => {
    it('should return true for equal results', () => {
      const timestamp = new Date('2025-11-25T12:00:00Z');
      const result1 = RaceCreationResult.create({
        sessionId: 'test-session-123',
        price: '$10.00',
        timestamp,
      });
      const result2 = RaceCreationResult.create({
        sessionId: 'test-session-123',
        price: '$10.00',
        timestamp,
      });

      expect(result1.equals(result2)).toBe(true);
    });

    it('should return false for different session IDs', () => {
      const timestamp = new Date('2025-11-25T12:00:00Z');
      const result1 = RaceCreationResult.create({
        sessionId: 'test-session-123',
        price: '$10.00',
        timestamp,
      });
      const result2 = RaceCreationResult.create({
        sessionId: 'test-session-456',
        price: '$10.00',
        timestamp,
      });

      expect(result1.equals(result2)).toBe(false);
    });

    it('should return false for different prices', () => {
      const timestamp = new Date('2025-11-25T12:00:00Z');
      const result1 = RaceCreationResult.create({
        sessionId: 'test-session-123',
        price: '$10.00',
        timestamp,
      });
      const result2 = RaceCreationResult.create({
        sessionId: 'test-session-123',
        price: '$20.00',
        timestamp,
      });

      expect(result1.equals(result2)).toBe(false);
    });
  });

  describe('toJSON', () => {
    it('should serialize to JSON correctly', () => {
      const timestamp = new Date('2025-11-25T12:00:00Z');
      const result = RaceCreationResult.create({
        sessionId: 'test-session-123',
        price: '$10.00',
        timestamp,
      });

      const json = result.toJSON();

      expect(json).toEqual({
        sessionId: 'test-session-123',
        price: '$10.00',
        timestamp: timestamp.toISOString(),
      });
    });
  });
});