RentalNotReadyForActivationException.java

package com.github.jenkaby.bikerental.rental.domain.exception;

import com.github.jenkaby.bikerental.shared.exception.BikeRentalException;
import lombok.Getter;

import java.util.List;

/**
 * Exception thrown when rental cannot be activated because required fields are missing.
 * <p>
 * Rental must have all required fields filled before activation:
 * - customerId
 * - equipmentId
 * - tariffId
 * - plannedDuration
 * - estimatedCost
 */
@Getter
public class RentalNotReadyForActivationException extends BikeRentalException {

    public static final String ERROR_CODE = "rental.activation.not_ready";

    private static final String MESSAGE_TEMPLATE = "Rental cannot be activated. Missing required fields: %s";

    private final List<String> missingFields;

    public RentalNotReadyForActivationException(List<String> missingFields) {
        super(MESSAGE_TEMPLATE.formatted(String.join(", ", missingFields)), ERROR_CODE);
        this.missingFields = missingFields;
    }

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

    public record MissingFields(List<String> fields) {
    }
}