RentalDurationCalculatorImpl.java

package com.github.jenkaby.bikerental.rental.application.service;

import com.github.jenkaby.bikerental.rental.domain.service.BaseRentalDurationResult;
import com.github.jenkaby.bikerental.rental.domain.service.RentalDurationCalculator;
import com.github.jenkaby.bikerental.rental.domain.service.RentalDurationResult;
import com.github.jenkaby.bikerental.shared.config.RentalProperties;
import org.jspecify.annotations.NonNull;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.time.LocalDateTime;


@Service
public class RentalDurationCalculatorImpl implements RentalDurationCalculator {

    private final RentalProperties properties;

    public RentalDurationCalculatorImpl(RentalProperties properties) {
        this.properties = properties;
    }

    public int getTimeIncrementMinutes() {
        return (int) properties.timeIncrement().toMinutes();
    }


    @Override
    public RentalDurationResult calculate(@NonNull LocalDateTime start, @NonNull LocalDateTime end) {
        // Calculate once
        Duration actualDuration = Duration.between(start, end);
        long actualMinutes = actualDuration.toMinutes();

        int increment = getTimeIncrementMinutes();
        int billableMinutes = (int) ((actualMinutes + increment - 1) / increment) * increment;

        return new BaseRentalDurationResult(
                billableMinutes,
                actualDuration
        );
    }
}