<?php

declare(strict_types=1);

namespace App\Support;

/**
 * DBErp 宿主产品版本（安装向导、对外页脚、系统信息、`php artisan about` 等）。
 *
 * 更新比对请使用 {@see self::updateVersion()}（数值型），勿用展示用语义化版本串比较。
 */
final class DberpProductVersion
{
    public function displayVersion(): string
    {
        return (string) config('dberp.version.display_version', '3.0.0-rc.1');
    }

    public function updateVersion(): int
    {
        return (int) config('dberp.version.update_version', 299981);
    }

    public function editionName(): string
    {
        return (string) config('dberp.version.edition_name', 'RC 版');
    }

    public function build(): ?string
    {
        $build = config('dberp.version.build');

        if ($build === null || $build === '') {
            return null;
        }

        return (string) $build;
    }

    /**
     * 对外产品名称（登录页脚、后台页脚、系统信息）；优先 dberp.public_product.name。
     */
    public function publicProductName(): string
    {
        return app(DberpProductBranding::class)->displayName();
    }

    /**
     * 对外语义化版本号（不含「v」前缀）；优先 dberp.public_product.version。
     */
    public function publicProductSemanticVersion(): string
    {
        $raw = trim((string) config(
            'dberp.public_product.version',
            config('dberp.version.display_version', '3.0.0-rc.1'),
        ));

        if ($raw === '') {
            return '3.0.0-rc.1';
        }

        return ltrim($raw, 'vV');
    }

    /**
     * 面向业务展示的「v」+ 语义化版本，例如 v3.0.0-rc.1。
     */
    public function publicSemanticVersionLabel(): string
    {
        $core = $this->publicProductSemanticVersion();

        return str_starts_with(strtolower($core), 'v') ? $core : 'v'.$core;
    }

    /**
     * 发行线/版本类型展示（系统信息等）；优先 dberp.public_product.edition。
     */
    public function publicProductEdition(): string
    {
        return (string) config(
            'dberp.public_product.edition',
            config('dberp.version.edition_name', 'RC 版'),
        );
    }

    /**
     * 登录页脚等：「产品名 vX.Y.Z」（不含内部更新号）。
     */
    public function publicProductLineLoginFooter(): string
    {
        return $this->publicProductName().' '.$this->publicSemanticVersionLabel();
    }

    /**
     * 已登录后台全局页脚：「产品名 · vX.Y.Z」。
     */
    public function publicProductLineAdminFooter(): string
    {
        return $this->publicProductName().' · '.$this->publicSemanticVersionLabel();
    }

    /**
     * 安装向导首页主标题下的完整产品版本行（业务可读）。
     */
    public function installerHomepageTitle(): string
    {
        $base = (string) config('dberp.version.installer_title_base', 'DBErp 进销存系统');
        $edition = $this->editionName();
        $version = $this->displayVersion();

        return $base.' · '.$edition.' v'.$version;
    }

    /**
     * 环境检测页等处的「当前安装向导」版本摘要（与首页口径一致）。
     */
    public function installerWizardVersionSummary(): string
    {
        return $this->installerHomepageTitle();
    }

    /**
     * 安装完成页：强调已落盘的软件版本表述。
     */
    public function installerFinishedVersionSentence(): string
    {
        return '本次安装的软件版本为 '.$this->installerHomepageTitle().'。';
    }

    /**
     * 安装向导错误页等面向客户的版本信息（不含内部更新号、构建标识）。
     *
     * @return list<array{label: string, value: string}>
     */
    public function diagnosticsRowsForInstaller(): array
    {
        return [
            ['label' => '软件版本', 'value' => $this->publicSemanticVersionLabel()],
            ['label' => '发行线', 'value' => $this->publicProductEdition()],
        ];
    }

    /**
     * @return array<string, string>
     */
    public function diagnosticsKeyValueStrings(): array
    {
        $rows = [
            'display_version' => $this->displayVersion(),
            'edition_name' => $this->editionName(),
            'update_version' => (string) $this->updateVersion(),
        ];

        $build = $this->build();
        if ($build !== null) {
            $rows['build'] = $build;
        }

        return $rows;
    }

    /**
     * `php artisan about` 中「DBErp Product」分组展示用。
     *
     * @return array<string, string>
     */
    public function aboutSectionRows(): array
    {
        $rows = [
            'Display Version' => $this->displayVersion(),
            'Edition' => $this->editionName(),
            'Update Version' => (string) $this->updateVersion(),
        ];

        $build = $this->build();
        $rows['Build'] = $build ?? '—';

        return $rows;
    }
}
