<?php

declare(strict_types=1);

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

namespace App\Services\Plugin;

use Illuminate\Support\Facades\Lang;

/**
 * 官方插件 manifest 权限动作文案解析（供权限目录与角色表单使用）。
 */
final class HostPluginPermissionLabelResolver
{
    public function actionLabel(string $action, ?array $manifest): string
    {
        $normalizedAction = trim($action);

        if ($normalizedAction === '') {
            return '';
        }

        $fromManifest = $this->labelFromManifest($normalizedAction, $manifest);

        if ($fromManifest !== null) {
            return $fromManifest;
        }

        $locale = app()->getLocale();
        $translationKey = 'dberp.plugin_permission_actions.'.$normalizedAction;

        if (Lang::hasForLocale($translationKey, $locale)) {
            return (string) Lang::get($translationKey, [], $locale, false);
        }

        return $this->humanizeAction($normalizedAction);
    }

    public function catalogDisplayName(string $actionLabel, string $pluginLabel): string
    {
        $actionLabel = trim($actionLabel);
        $pluginLabel = trim($pluginLabel);

        if ($actionLabel === '') {
            return $pluginLabel;
        }

        if ($pluginLabel === '') {
            return $actionLabel;
        }

        return $pluginLabel.' · '.$actionLabel;
    }

    /**
     * @param  array<string, mixed>|null  $manifest
     */
    private function labelFromManifest(string $action, ?array $manifest): ?string
    {
        if (! is_array($manifest)) {
            return null;
        }

        $labels = $manifest['permission_labels'] ?? null;

        if (! is_array($labels)) {
            return null;
        }

        $label = $labels[$action] ?? null;

        if (! is_string($label)) {
            return null;
        }

        $label = trim($label);

        return $label !== '' ? $label : null;
    }

    private function humanizeAction(string $action): string
    {
        $segments = array_values(array_filter(explode('_', $action), static fn (string $segment): bool => $segment !== ''));

        if ($segments === []) {
            return $action;
        }

        return implode(' ', array_map(
            static fn (string $segment): string => mb_convert_case($segment, MB_CASE_TITLE, 'UTF-8'),
            $segments,
        ));
    }
}
