<?php

declare(strict_types=1);

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

namespace App\Business\DataImport;

use App\Business\DataImport\Enums\DataImportType;

/**
 * 导入类型引用：兼容内置 {@see DataImportType} 与插件扩展类型（字符串 key）。
 */
final readonly class DataImportTypeReference
{
    private function __construct(
        public string $key,
    ) {}

    public static function fromKey(string $key): self
    {
        $normalized = trim($key);

        if ($normalized === '') {
            throw new \InvalidArgumentException('Data import type key cannot be empty.');
        }

        return new self($normalized);
    }

    public static function fromEnum(DataImportType $type): self
    {
        return new self($type->value);
    }

    public static function from(DataImportType|self|string $type): self
    {
        if ($type instanceof self) {
            return $type;
        }

        if ($type instanceof DataImportType) {
            return self::fromEnum($type);
        }

        return self::fromKey($type);
    }

    public function toEnum(): ?DataImportType
    {
        return DataImportType::tryFrom($this->key);
    }

    public function isBuiltin(): bool
    {
        return $this->toEnum() !== null;
    }

    public function label(): string
    {
        $enum = $this->toEnum();

        if ($enum !== null) {
            return $enum->label();
        }

        if (app()->bound(DataImportDefinitionRegistry::class)) {
            $definition = app(DataImportDefinitionRegistry::class)->tryGet($this->key);

            if ($definition !== null) {
                return $definition->label;
            }
        }

        return $this->key;
    }

    /**
     * 与 {@see DataImportType::$value} 保持一致，便于审计与存储。
     */
    public function value(): string
    {
        return $this->key;
    }
}
