OverBudgetSettlementException.java

package com.github.jenkaby.bikerental.shared.exception;

import com.github.jenkaby.bikerental.shared.domain.model.vo.Money;
import com.github.jenkaby.bikerental.shared.web.advice.ErrorCodes;
import lombok.Getter;

@Getter
public class OverBudgetSettlementException extends BikeRentalException {

    public static final String ERROR_CODE = ErrorCodes.OVER_BUDGET_SETTLEMENT;

    private static final String MESSAGE_TEMPLATE = "Settlement rejected: final cost %s exceeds available balance %s";

    public OverBudgetSettlementException(Money finalCost, Money availableAmount) {
        super(
                MESSAGE_TEMPLATE.formatted(finalCost, availableAmount),
                ERROR_CODE,
                new Details(finalCost, availableAmount)
        );
    }

    public Details getDetails() {
        return getParams().map(params -> (Details) params)
                .orElseThrow(() -> new IllegalArgumentException("Expected Details in exception parameters"));
    }

    public record Details(Money finalCost, Money availableAmount) {
    }
}