package com.sequenceiq.cloudbreak.service.usages;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.Temporal;
import java.util.Date;
import java.util.Optional;
import org.springframework.stereotype.Service;
import com.sequenceiq.cloudbreak.domain.CloudbreakUsage;
@Service
public class UsageTimeService {
public static final int MINUTES_IN_HOUR = 60;
public long daysBetweenDateAndNow(Date date) {
ZonedDateTime dt = date.toInstant().atZone(ZoneId.systemDefault()).with(this::startOfDay);
ZonedDateTime today = LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault());
Duration d = Duration.between(dt, today);
return d.toDays();
}
public long convertToInstanceHours(Duration d) {
return (long) Math.ceil(d.toMinutes() * 1.0 / MINUTES_IN_HOUR);
}
public Duration calculateNewDuration(CloudbreakUsage usage) {
Duration d = Duration.between(usage.getPeriodStarted().toInstant(), getEndInstant(usage.getPeriodStarted()));
Duration already = stringToDuration(usage.getDuration());
return already.plus(d.multipliedBy(usage.getInstanceNum()));
}
public Instant getStartOfDay() {
return ZonedDateTime.now().with(this::startOfDay).toInstant();
}
private Temporal startOfDay(Temporal input) {
LocalDateTime t = LocalDate.from(input).atStartOfDay();
return input.with(t);
}
private Temporal endOfDay(Temporal input) {
LocalDateTime t = LocalDate.from(input)
.plusDays(1)
.atStartOfDay()
.minusSeconds(1);
return input.with(t);
}
private Duration stringToDuration(String duration) {
return Optional.ofNullable(duration).map(Duration::parse).orElse(Duration.ZERO);
}
private Instant getEndInstant(Date start) {
ZonedDateTime startDt = start.toInstant().atZone(ZoneId.systemDefault());
ZonedDateTime nowDt = ZonedDateTime.now();
if (sameDay(startDt, nowDt)) {
return nowDt.toInstant();
}
return startDt.with(this::endOfDay).toInstant();
}
private boolean sameDay(ZonedDateTime t1, ZonedDateTime t2) {
return t1.getYear() == t2.getYear() && t1.getDayOfYear() == t2.getDayOfYear();
}
}