<?php

declare(strict_types=1);

/**
 * 本文件属于 DBErp 进销存系统。
 *
 * 版权所有 © 2026 北京珑大钜商科技有限公司。保留所有权利。
 *
 * 未经官方授权，不得删除、篡改或隐藏本文件中的版权声明、产品标识与来源信息。
 * 商业授权、官方更新与技术支持服务，请以珑大官方支持中心记录为准。
 *
 * @link https://support.loongdom.cn
 * @see  https://www.dberp.com.cn
 */

namespace App\Business\MasterData;

use App\Tools\Entity\EntityReference;
use App\Tools\Entity\EntityType;
use App\Tools\Support\ToolBusinessDate;
use App\Tools\Support\ToolDateRange;
use DateTimeImmutable;
use DateTimeInterface;
use DateTimeZone;

/**
 * 客户/供应商业务快照共用的默认近期窗口。与主数据页 RECENT_BUSINESS_DAYS 对齐。
 */
final class PartnerBusinessSummarySupport
{
    public const RECENT_BUSINESS_DAYS = 90;

    /**
     * 未传日期时默认 [today-90, today]；两端均为闭区间，跨度仍受 ToolDateRange 366 天限制。
     *
     * @param  array<string, mixed>  $input
     * @return array{from: ?string, until: ?string}
     */
    public static function resolvePeriod(array $input, string $today): array
    {
        $from = $input['date_from'] ?? null;
        $until = $input['date_until'] ?? null;

        if (self::isBlank($from) && self::isBlank($until)) {
            $from = self::subtractDays($today, self::RECENT_BUSINESS_DAYS);
            $until = $today;
        }

        return ToolDateRange::parseOptional($from, $until, 'date_from', 'date_until');
    }

    public static function calendarDate(mixed $value): ?string
    {
        if ($value === null) {
            return null;
        }

        if ($value instanceof DateTimeInterface) {
            return $value->format(ToolBusinessDate::FORMAT);
        }

        $normalized = trim((string) $value);

        if ($normalized === '') {
            return null;
        }

        return substr($normalized, 0, 10);
    }

    /**
     * @return array<string, mixed>
     */
    public static function identity(int $id, string $code, string $name, bool $isEnabled, EntityType $entityType): array
    {
        return EntityReference::attach([
            'id' => $id,
            'code' => $code,
            'name' => $name,
            'is_enabled' => $isEnabled,
        ], $entityType, $id, $code, $name);
    }

    private static function subtractDays(string $date, int $days): string
    {
        $parsed = DateTimeImmutable::createFromFormat('!'.ToolBusinessDate::FORMAT, $date, new DateTimeZone('UTC'));

        if (! $parsed instanceof DateTimeImmutable) {
            return $date;
        }

        return $parsed->modify('-'.$days.' days')->format(ToolBusinessDate::FORMAT);
    }

    private static function isBlank(mixed $value): bool
    {
        return $value === null || (is_string($value) && trim($value) === '');
    }
}
