<?php

namespace App\Support;

use Carbon\Carbon;

class FinancialYear
{
    public static function forDate(?Carbon $date = null): string
    {
        $date = $date ?? now();
        $startYear = $date->month >= 4 ? $date->year : $date->year - 1;

        return $startYear . '-' . substr((string) ($startYear + 1), -2);
    }

    public static function startDate(string $financialYear): Carbon
    {
        $startYear = (int) explode('-', $financialYear)[0];

        return Carbon::create($startYear, 4, 1)->startOfDay();
    }

    public static function endDate(string $financialYear): Carbon
    {
        $startYear = (int) explode('-', $financialYear)[0];

        return Carbon::create($startYear + 1, 3, 31)->endOfDay();
    }

    public static function remainingMonths(?Carbon $asOf = null): int
    {
        $asOf = $asOf ?? now();
        $end = self::endDate(self::forDate($asOf));

        if ($asOf->greaterThan($end)) {
            return 1;
        }

        $months = 0;
        $cursor = $asOf->copy()->startOfMonth();

        while ($cursor->lessThanOrEqualTo($end->copy()->startOfMonth())) {
            $months++;
            $cursor->addMonth();
        }

        return max(1, $months);
    }

    public static function monthInFinancialYear(int $month, int $year): bool
    {
        $date = Carbon::create($year, $month, 1);

        return $date->betweenIncluded(self::startDate(self::forDate($date)), self::endDate(self::forDate($date)));
    }
}
