<?php

declare(strict_types=1);

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

namespace App\Services\Install;

use App\Auth\Passport\DberpPassportSigningKeyBootstrap;

/**
 * Web 安装可选收尾：若尚未配置授权签名密钥则生成一次，失败仅记警告。
 */
final class WebInstallOptionalPassportKeysStep
{
    public function __construct(
        private readonly DberpPassportSigningKeyBootstrap $signingKeys,
        private readonly DBErpInstallLogger $installLogger,
    ) {}

    public function run(WebInstallFinalizationWarnings $warnings): void
    {
        if ($this->signingKeys->isConfigured()) {
            $this->installLogger->optionalCommandOutcome(
                'passport:keys',
                'skipped',
                0,
                '授权签名密钥已存在，跳过生成',
                [
                    'reason' => 'already_configured',
                    'warning_message' => null,
                ],
            );

            return;
        }

        $this->installLogger->stepProgress('artisan', '开始执行可选收尾：生成授权签名密钥', [
            'command' => 'passport:keys',
            'optional' => true,
        ]);

        $ok = $this->signingKeys->ensureOnce();

        if ($ok) {
            $this->installLogger->optionalCommandOutcome(
                'passport:keys',
                'executed',
                0,
                '授权签名密钥已生成',
                [
                    'reason' => 'generated_once',
                    'warning_message' => null,
                ],
            );

            return;
        }

        $warning = WebInstallUserMessages::PASSPORT_KEYS_GENERATE_FAILED;
        $warnings->add($warning);
        $this->installLogger->optionalCommandOutcome(
            'passport:keys',
            'failed',
            null,
            '授权签名密钥未能自动生成',
            [
                'reason' => 'generate_failed',
                'warning_message' => $warning,
            ],
        );
    }
}
