<?php

declare(strict_types=1);

namespace Acms\Services\Media;

/**
 * メディアの一括アップロードに関する設定値の正規化を担う。
 *
 * config から取得した値（未設定・不正値を含む）を、フロントエンドへ
 * 渡しても安全な範囲の整数に丸める純粋ロジックを提供する。
 */
class UploadSetting
{
    /**
     * 一度にアップロードできる件数のデフォルト上限。
     */
    public const DEFAULT_LIMIT = 100;

    /**
     * 一度にアップロードできる件数の許容最大値（安全弁）。
     */
    public const MAX_LIMIT = 1000;

    /**
     * 同時アップロード数（並列度）のデフォルト。
     */
    public const DEFAULT_CONCURRENCY = 4;

    /**
     * 同時アップロード数（並列度）の許容最大値。
     */
    public const MAX_CONCURRENCY = 20;

    /**
     * アップロード件数上限を正規化する。
     *
     * @param mixed $value config 由来の生値
     * @return int 1〜MAX_LIMIT の範囲の整数。不正値はデフォルトにフォールバックする
     */
    public static function normalizeLimit(mixed $value): int
    {
        return self::normalize($value, self::DEFAULT_LIMIT, self::MAX_LIMIT);
    }

    /**
     * 同時アップロード数（並列度）を正規化する。
     *
     * @param mixed $value config 由来の生値
     * @return int 1〜MAX_CONCURRENCY の範囲の整数。不正値はデフォルトにフォールバックする
     */
    public static function normalizeConcurrency(mixed $value): int
    {
        return self::normalize($value, self::DEFAULT_CONCURRENCY, self::MAX_CONCURRENCY);
    }

    /**
     * 数値として解釈できない値・1 未満はデフォルトへ、最大値超過はクランプする。
     *
     * @param mixed $value
     */
    private static function normalize(mixed $value, int $default, int $max): int
    {
        if (!is_numeric($value)) {
            return $default;
        }
        $int = (int)$value;
        if ($int < 1) {
            return $default;
        }
        if ($int > $max) {
            return $max;
        }
        return $int;
    }
}
