Account.java

package com.github.jenkaby.bikerental.finance.domain.model;

import com.github.jenkaby.bikerental.finance.PaymentMethod;
import com.github.jenkaby.bikerental.shared.exception.ResourceNotFoundException;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.experimental.SuperBuilder;

import java.util.List;
import java.util.UUID;

@Getter
@SuperBuilder
@EqualsAndHashCode(of = "id")
public abstract class Account {

    private final UUID id;
    private final List<SubLedger> subLedgers;

    public abstract AccountType getAccountType();


    public SubLedger getSubLedger(PaymentMethod paymentMethod) {
        var type = switch (paymentMethod) {
            case CASH -> LedgerType.CASH;
            case CARD_TERMINAL -> LedgerType.CARD_TERMINAL;
            case BANK_TRANSFER -> LedgerType.BANK_TRANSFER;
            case INTERNAL_TRANSFER -> LedgerType.ADJUSTMENT;
            default -> throw new IllegalArgumentException("Unsupported payment method: " + paymentMethod);
        };
        return getSubLedger(type);
    }

    protected SubLedger getSubLedger(LedgerType type) {
        return subLedgers.stream()
                .filter(sl -> sl.getLedgerType() == type)
                .findFirst()
                .orElseThrow(() -> new ResourceNotFoundException(SubLedger.class, type.name()));
    }
}