import { describe, it, expect, vi, Mocked } from 'vitest';
import { MembershipFeeService } from './MembershipFeeService';
import { PaymentsApiClient } from '@/lib/api/payments/PaymentsApiClient';
import { MembershipFeeViewModel } from '../../view-models';
import type { MembershipFeeDto } from '@/lib/types/generated';

describe('MembershipFeeService', () => {
  let mockApiClient: Mocked<PaymentsApiClient>;
  let service: MembershipFeeService;

  beforeEach(() => {
    mockApiClient = {
      getMembershipFees: vi.fn(),
    } as Mocked<PaymentsApiClient>;

    service = new MembershipFeeService(mockApiClient);
  });

  describe('getMembershipFee', () => {
    it('should call apiClient.getMembershipFees with correct leagueId and return fee', async () => {
      const leagueId = 'league-123';
      const mockFee: any = { id: 'fee-1', leagueId: 'league-123', amount: 100 };
      const mockOutput = { fee: mockFee, payments: [] };
      mockApiClient.getMembershipFees.mockResolvedValue(mockOutput as any);

      const result = await service.getMembershipFee(leagueId);

      expect(mockApiClient.getMembershipFees).toHaveBeenCalledWith({ leagueId });
      expect(result).toBeInstanceOf(MembershipFeeViewModel);
      expect(result!.id).toEqual('fee-1');
    });

    it('should return null when no fee is returned', async () => {
      const leagueId = 'league-456';
      const mockOutput = { fee: null, payments: [] };
      mockApiClient.getMembershipFees.mockResolvedValue(mockOutput as any);

      const result = await service.getMembershipFee(leagueId);

      expect(mockApiClient.getMembershipFees).toHaveBeenCalledWith({ leagueId });
      expect(result).toBeNull();
    });
  });
});