FlatFeeTariffV2.java

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

import com.github.jenkaby.bikerental.shared.domain.model.vo.Money;
import com.github.jenkaby.bikerental.tariff.BreakdownCostDetails;
import com.github.jenkaby.bikerental.tariff.RentalCostV2;
import com.github.jenkaby.bikerental.tariff.domain.service.BaseRentalCostV2;
import lombok.Getter;

import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDate;

@Getter
public final class FlatFeeTariffV2 extends TariffV2 {

    private final Money issuanceFee;

    public FlatFeeTariffV2(Long id, String name, String description, String equipmentTypeSlug,
                           String version, LocalDate validFrom, LocalDate validTo, TariffV2Status status,
                           Money issuanceFee) {
        super(id, name, description, equipmentTypeSlug, PricingType.FLAT_FEE, version, validFrom, validTo, status);
        this.issuanceFee = issuanceFee;
    }

    @Override
    public RentalCostV2 calculateCost(Duration duration) {
        int days = isNegative(duration) ? 1 : getNumberOfDays(duration);
        Money cost = issuanceFee.multiply(BigDecimal.valueOf(days));
        String message = String.format("Flat fee: %s*%dd = %s", issuanceFee, days, cost);
        return new BaseRentalCostV2(cost, new BreakdownCostDetails.FlatFee(message,
                new BreakdownCostDetails.FlatFee.Details(issuanceFee.toString(), days, cost.toString())));
    }
}