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

describe('MembershipFee', () => {
  it('should create valid membership fee', () => {
    const amount = Money.create(1000, 'USD');
    const fee = MembershipFee.create('season', amount);
    expect(fee.type).toBe('season');
    expect(fee.amount).toBe(amount);
  });

  it('should validate type required', () => {
    const amount = Money.create(1000, 'USD');
    expect(() => MembershipFee.create('' as 'season', amount)).toThrow('MembershipFee type is required');
  });

  it('should validate amount required', () => {
    expect(() => MembershipFee.create('season', null as unknown as Money)).toThrow('MembershipFee amount is required');
  });

  it('should validate amount not negative', () => {
    expect(() => Money.create(-100, 'USD')).toThrow('Money amount cannot be negative');
  });

  it('should get platform fee', () => {
    const amount = Money.create(1000, 'USD'); // $10.00
    const fee = MembershipFee.create('season', amount);
    const platformFee = fee.getPlatformFee();
    expect(platformFee.amount).toBe(100); // $1.00
    expect(platformFee.currency).toBe('USD');
  });

  it('should get net amount', () => {
    const amount = Money.create(1000, 'USD'); // $10.00
    const fee = MembershipFee.create('season', amount);
    const netAmount = fee.getNetAmount();
    expect(netAmount.amount).toBe(900); // $9.00
    expect(netAmount.currency).toBe('USD');
  });

  it('should check if recurring', () => {
    const amount = Money.create(1000, 'USD');
    const seasonFee = MembershipFee.create('season', amount);
    const monthlyFee = MembershipFee.create('monthly', amount);
    const perRaceFee = MembershipFee.create('per_race', amount);
    expect(seasonFee.isRecurring()).toBe(false);
    expect(monthlyFee.isRecurring()).toBe(true);
    expect(perRaceFee.isRecurring()).toBe(false);
  });

  it('should have props', () => {
    const amount = Money.create(1000, 'USD');
    const fee = MembershipFee.create('season', amount);
    expect(fee.props).toEqual({
      type: 'season',
      amount,
    });
  });

  it('equals', () => {
    const amount1 = Money.create(1000, 'USD');
    const amount2 = Money.create(1000, 'USD');
    const amount3 = Money.create(2000, 'USD');
    const fee1 = MembershipFee.create('season', amount1);
    const fee2 = MembershipFee.create('season', amount2);
    const fee3 = MembershipFee.create('monthly', amount1);
    const fee4 = MembershipFee.create('season', amount3);
    expect(fee1.equals(fee2)).toBe(true);
    expect(fee1.equals(fee3)).toBe(false);
    expect(fee1.equals(fee4)).toBe(false);
  });
});