<?php

declare(strict_types=1);

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

namespace App\Support\PluginRelease;

use RuntimeException;

/**
 * 为官方插件 ZIP 内文件生成 checksums.json。
 */
class OfficialPluginReleaseChecksumBuilder
{
    public const SCHEMA = 'dberp-plugin-checksums-v1';

    public const ALGORITHM = 'sha256';

    /**
     * @param  array<string, string>  $files  relative posix path => absolute path
     * @return array<string, mixed>
     */
    public function build(array $files): array
    {
        $checksums = [];

        foreach ($files as $relativePath => $absolutePath) {
            $hash = @hash_file(self::ALGORITHM, $absolutePath);

            if (! is_string($hash) || $hash === '') {
                throw new RuntimeException("Unable to hash file: {$relativePath}");
            }

            $checksums[$relativePath] = strtolower($hash);
        }

        ksort($checksums, SORT_STRING);

        return [
            'schema' => self::SCHEMA,
            'algorithm' => self::ALGORITHM,
            'files' => $checksums,
        ];
    }

    /**
     * @param  array<string, mixed>  $checksumsDocument
     */
    public function toJson(array $checksumsDocument): string
    {
        return (string) json_encode(
            $checksumsDocument,
            JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,
        ).PHP_EOL;
    }
}
