CancelReservationScreen.java

package io.extact.rms.client.console.ui.member;

import static io.extact.rms.client.console.ui.ClientConstants.*;
import static io.extact.rms.client.console.ui.textio.TextIoUtils.*;

import io.extact.rms.client.api.RentalReservationClientApi;
import io.extact.rms.client.api.dto.ReservationClientDto;
import io.extact.rms.client.api.dto.UserAccountClientDto;
import io.extact.rms.client.api.exception.BusinessFlowClientException;
import io.extact.rms.client.console.ui.ClientConstants;
import io.extact.rms.client.console.ui.TransitionMap.RmsScreen;
import io.extact.rms.client.console.ui.TransitionMap.Transition;
import io.extact.rms.client.console.ui.textio.TextIoUtils;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class CancelReservationScreen implements RmsScreen {

    private final RentalReservationClientApi clientApi;

    @Override
    public Transition play(UserAccountClientDto loginUser, boolean printHeader) {

        if (printHeader) {
            printScreenHeader(loginUser, "レンタル品予約キャンセル画面");
        }

        var ownReservations = clientApi.getOwnReservations();

        // キャンセル可能な予約がない場合はメニューへ戻る
        if (ownReservations.isEmpty()) {
            printWarningInformation(CANNOT_CANCEL_RESERVATION_INFORMATION);
            waitPressEnter();
            return Transition.MEMBER_MAIN;
        }

        // キャンセル可能な予約一覧を表示
        println(CANCEL_RESERVATION_INFORMATION);
        ownReservations.forEach(dto ->
            println(ClientConstants.RESERVATION_FORMAT.format(dto))
        );
        blankLine();

        // キャンセルする予約を選択
        var selectedReservation = newIntInputReader()
                .withSelectableValues(
                        ownReservations.stream()
                            .map(ReservationClientDto::getId)
                            .toList(),
                        SCREEN_BREAK_VALUE)
                .read("予約番号");
        if (TextIoUtils.isBreak(selectedReservation)) {
            return Transition.MEMBER_MAIN;
        }

        blankLine();

        // レンタル品の予約キャンセルの実行
        try {
            clientApi.cancelReservation(selectedReservation);
            printResultInformation(selectedReservation);
            return Transition.MEMBER_MAIN;

        } catch (BusinessFlowClientException e) {
            printServerError(e);
            return play(loginUser, false); // start over!!

        }
    }

    private void printResultInformation(Integer selectedItem) {
        println("***** 予約キャンセル確定結果 *****");
        printf("[%s]の予約をキャンセルしました", selectedItem);
        blankLine();
        blankLine();
        waitPressEnter();
    }
}