<?php

declare(strict_types=1);

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

namespace App\Services\SupportCenter;

/**
 * PHP CLI 可执行文件解析结果（供更新诊断与子进程拼装使用）。
 */
final readonly class PhpCliBinaryResolution
{
    public const STATUS_VERIFIED = 'verified';

    public const STATUS_UNCONFIGURED = 'unconfigured';

    public const STATUS_NON_CLI_RUNTIME = 'non_cli_runtime';

    public const STATUS_UNVERIFIABLE = 'unverifiable';

    public const STATUS_MISSING = 'missing';

    public const STATUS_NOT_EXECUTABLE = 'not_executable';

    public const SOURCE_CONFIG = 'config';

    public const SOURCE_INFERRED = 'inferred';

    public const SOURCE_PHP_BINARY = 'php_binary';

    public const SOURCE_NONE = 'none';

    public function __construct(
        public string $status,
        public ?string $path,
        public string $source,
        public bool $isNonCliBinary,
    ) {}

    public function isVerified(): bool
    {
        return $this->status === self::STATUS_VERIFIED && is_string($this->path) && $this->path !== '';
    }

    public function isUnverifiable(): bool
    {
        return $this->status === self::STATUS_UNVERIFIABLE;
    }

    public function isUsableForProcess(): bool
    {
        if ($this->isNonCliBinary) {
            return false;
        }

        if ($this->isVerified()) {
            return true;
        }

        // 显式配置或从 php-fpm 等运行时路径推断的 CLI，Web 侧可能因 open_basedir 无法校验，但仍可用于子进程。
        return in_array($this->source, [self::SOURCE_CONFIG, self::SOURCE_INFERRED], true)
            && $this->isUnverifiable()
            && is_string($this->path)
            && $this->path !== '';
    }
}
