<?php

declare(strict_types=1);

namespace OpenSpout\Writer\XLSX\Helper;

use DateInterval;

/**
 * @internal
 */
final readonly class DateIntervalHelper
{
    /**
     * Excel stores time durations as fractions of days:
     *   A value of 1 equals 24 hours, a value of 0.5 equals 12 hours, etc.
     *
     * Note: Excel can only display durations up to hours and it will only auto-detect this value as an actual duration
     *     if the value is less than 1, even if you specify a custom format such als "hh:mm:ss".
     *   To force the display into a duration format, you have to use the brackets around the left most unit
     *     of the format, e.g. "[h]:mm" or "[mm]:ss", which tells Excel to use up all the remaining time exceeding
     *     this unit and put it in this last unit.
     */
    public static function toExcel(DateInterval $interval): float
    {
        // For years and months we can only use the respective average of days here - this won't be accurate, but the
        // DateInterval doesn't give us more details on those:
        $days = $interval->y * 365.25
            + $interval->m * 30.437
            + $interval->d
            + $interval->h / 24
            + $interval->i / 24 / 60
            + $interval->s / 24 / 60 / 60;

        if (1 === $interval->invert) {
            $days *= -1;
        }

        return $days;
    }
}
