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

describe('CheckoutConfirmation Value Object', () => {
  describe('create', () => {
    it('should create confirmed decision', () => {
      const confirmation = CheckoutConfirmation.create('confirmed');
      expect(confirmation.value).toBe('confirmed');
    });

    it('should create cancelled decision', () => {
      const confirmation = CheckoutConfirmation.create('cancelled');
      expect(confirmation.value).toBe('cancelled');
    });

    it('should create timeout decision', () => {
      const confirmation = CheckoutConfirmation.create('timeout');
      expect(confirmation.value).toBe('timeout');
    });

    it('should throw error for invalid decision', () => {
      // @ts-expect-error Testing invalid input
      expect(() => CheckoutConfirmation.create('invalid')).toThrow(
        'Invalid checkout confirmation decision',
      );
    });
  });

  describe('isConfirmed', () => {
    it('should return true for confirmed decision', () => {
      const confirmation = CheckoutConfirmation.create('confirmed');
      expect(confirmation.isConfirmed()).toBe(true);
    });

    it('should return false for cancelled decision', () => {
      const confirmation = CheckoutConfirmation.create('cancelled');
      expect(confirmation.isConfirmed()).toBe(false);
    });

    it('should return false for timeout decision', () => {
      const confirmation = CheckoutConfirmation.create('timeout');
      expect(confirmation.isConfirmed()).toBe(false);
    });
  });

  describe('isCancelled', () => {
    it('should return true for cancelled decision', () => {
      const confirmation = CheckoutConfirmation.create('cancelled');
      expect(confirmation.isCancelled()).toBe(true);
    });

    it('should return false for confirmed decision', () => {
      const confirmation = CheckoutConfirmation.create('confirmed');
      expect(confirmation.isCancelled()).toBe(false);
    });

    it('should return false for timeout decision', () => {
      const confirmation = CheckoutConfirmation.create('timeout');
      expect(confirmation.isCancelled()).toBe(false);
    });
  });

  describe('isTimeout', () => {
    it('should return true for timeout decision', () => {
      const confirmation = CheckoutConfirmation.create('timeout');
      expect(confirmation.isTimeout()).toBe(true);
    });

    it('should return false for confirmed decision', () => {
      const confirmation = CheckoutConfirmation.create('confirmed');
      expect(confirmation.isTimeout()).toBe(false);
    });

    it('should return false for cancelled decision', () => {
      const confirmation = CheckoutConfirmation.create('cancelled');
      expect(confirmation.isTimeout()).toBe(false);
    });
  });

  describe('equals', () => {
    it('should return true for equal confirmations', () => {
      const confirmation1 = CheckoutConfirmation.create('confirmed');
      const confirmation2 = CheckoutConfirmation.create('confirmed');
      expect(confirmation1.equals(confirmation2)).toBe(true);
    });

    it('should return false for different confirmations', () => {
      const confirmation1 = CheckoutConfirmation.create('confirmed');
      const confirmation2 = CheckoutConfirmation.create('cancelled');
      expect(confirmation1.equals(confirmation2)).toBe(false);
    });
  });
});