BreakdownCostDetails.java

package com.github.jenkaby.bikerental.tariff;

import com.github.jenkaby.bikerental.shared.domain.utils.MessageCode;
import lombok.Getter;
import lombok.ToString;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;

@Getter
@ToString
public abstract class BreakdownCostDetails {
    protected String breakdownPatternCode;
    protected String message;
    protected Object params;

    public BreakdownCostDetails(@NonNull String breakdownPatternCode,
                                @NonNull String message,
                                @Nullable Object params) {
        this.breakdownPatternCode = breakdownPatternCode;
        this.message = message;
        this.params = params;
    }

    public static class Special extends BreakdownCostDetails {
        public Special() {
            super(MessageCode.BREAKDOWN_SPECIAL_PRICE, "Special tariff", null);
        }
    }

    public static class SpecialGroup extends BreakdownCostDetails {
        public SpecialGroup() {
            super(MessageCode.BREAKDOWN_SPECIAL_GROUP, "Special tariff applied to group", null);
        }
    }

    public static class Zero extends BreakdownCostDetails {
        public Zero() {
            super(MessageCode.BREAKDOWN_ZERO_COST, "0 min: 0.00", null);
        }
    }

    public static class FlatHourlyMinCost extends BreakdownCostDetails {
        public FlatHourlyMinCost(String message, Details details) {
            super(MessageCode.BREAKDOWN_FLAT_HOURLY_MIN, message, details);
        }

        public record Details(int durationMinutes, String rate, String surcharge, String total) {
        }
    }

    public static class FlatHourlyStandard extends BreakdownCostDetails {
        public FlatHourlyStandard(String message, Details details) {
            super(MessageCode.BREAKDOWN_FLAT_HOURLY_STANDARD, message, details);
        }

        public record Details(int hours, int minutes, String rate, String total) {
        }
    }

    public static class FlatHourlyMinsOnly extends BreakdownCostDetails {
        public FlatHourlyMinsOnly(String message, Details details) {
            super(MessageCode.BREAKDOWN_FLAT_HOURLY_MINUTES_ONLY, message, details);
        }

        public record Details(int minutes, String total) {
        }
    }

    public static class DailyStandard extends BreakdownCostDetails {
        public DailyStandard(String message, Details details) {
            super(MessageCode.BREAKDOWN_DAILY_STANDARD, message, details);
        }

        public record Details(int days, String total) {
        }
    }

    public static class DailyOvertime extends BreakdownCostDetails {
        public DailyOvertime(String message, Details details) {
            super(MessageCode.BREAKDOWN_DAILY_OVERTIME, message, details);
        }

        public record Details(int days, int hours, int minutes, String total) {
        }
    }

    public static class FlatFee extends BreakdownCostDetails {
        public FlatFee(String message, Details details) {
            super(MessageCode.BREAKDOWN_FLAT_FEE, message, details);
        }

        public record Details(String fee, int days, String total) {
        }
    }

    public static class DegressiveHourlyMin extends BreakdownCostDetails {
        public DegressiveHourlyMin(String message, Details details) {
            super(MessageCode.BREAKDOWN_DEGRESSIVE_HOURLY_MIN, message, details);
        }

        public record Details(long durationMinutes, String rate, String surcharge, String total) {
        }
    }

    public static class DegressiveHourlyStandard extends BreakdownCostDetails {
        public DegressiveHourlyStandard(String message, Details details) {
            super(MessageCode.BREAKDOWN_DEGRESSIVE_HOURLY_STANDARD, message, details);
        }

        public record Details(long hours, long minutes, String rateBreakdown, String total) {
        }
    }

    public static class DegressiveHourlyMinutesOnly extends BreakdownCostDetails {
        public DegressiveHourlyMinutesOnly(String message, Details details) {
            super(MessageCode.BREAKDOWN_DEGRESSIVE_HOURLY_MINUTES_ONLY, message, details);
        }

        public record Details(long minutes, String rateBreakdown, String total) {
        }
    }

    public static class Daily extends BreakdownCostDetails {
        public Daily(String message, Details details) {
            super(MessageCode.BREAKDOWN_DAILY_STANDARD, message, details);
        }

        public record Details(int days, int hours, int minutes, String total) {
        }
    }

    public static class DailyDaysOnly extends BreakdownCostDetails {
        public DailyDaysOnly(String message, Details details) {
            super(MessageCode.BREAKDOWN_DAILY_STANDARD, message, details);
        }

        public record Details(int days, String total) {
        }
    }

    public static class DailyWithOvertime extends BreakdownCostDetails {
        public DailyWithOvertime(String message, Details details) {
            super(MessageCode.BREAKDOWN_DAILY_OVERTIME, message, details);
        }

        public record Details(int days, int hours, int minutes, String total) {
        }
    }
}