<?php

use Illuminate\Support\Facades\Cache;

if (!function_exists('main_url')) {
    /**
     * 生成主站URL
     *
     * 当当前请求在绑定子域名上时（如 bbs.cmspro.com），
     * 生成指向主站域名的绝对URL（用于跨应用跳转，如用户中心、签到等）。
     * 否则返回相对路径。
     *
     * @param string $path 相对路径（如 'user'、'api/user/cmspro/signin/status'）
     * @return string 绝对URL或相对路径
     */
    function main_url(string $path = ''): string
    {
        $currentHost = request()->getHost();
        $boundDomains = \App\Providers\AppServiceProvider::getBoundDomains();

        if (in_array($currentHost, $boundDomains)) {
            $scheme = request()->isSecure() ? 'https' : 'http';
            $mainHost = parse_url(config('app.url'), PHP_URL_HOST);
            $base = rtrim($scheme . '://' . $mainHost, '/');
            return $path !== '' ? $base . '/' . ltrim($path, '/') : $base;
        }

        return '/' . ltrim($path, '/');
    }
}

if (!function_exists('system_version')) {
    function system_version(): string
    {
        return Cache::remember('system_current_version', 86400, function () {
            try {
                $record = \DB::table('app_versionmgr_system_version')
                    ->where('status', 1)
                    ->orderBy('id', 'desc')
                    ->first();

                if ($record) {
                    return $record->version;
                }
            } catch (\Throwable) {
            }

            return config('app.version', '5.0.1');
        });
    }
}

if (!function_exists('system_build')) {
    function system_build(): string
    {
        return Cache::remember('system_current_build', 86400, function () {
            try {
                $record = \DB::table('app_versionmgr_system_version')
                    ->where('status', 1)
                    ->orderBy('id', 'desc')
                    ->first();

                if ($record) {
                    return $record->build;
                }
            } catch (\Throwable) {
            }

            return '';
        });
    }
}

if (!function_exists('is_active_menu')) {
    function is_active_menu(string $path): bool
    {
        $current = '/' . ltrim(request()->path(), '/');
        $path = '/' . ltrim($path, '/');

        if ($path === '/') {
            return $current === '/';
        }

        return $current === $path || str_starts_with($current, $path . '/');
    }
}

if (!function_exists('menu_path')) {
    /**
     * 生成菜单链接 URL
     *
     * 当菜单所属应用为域名绑定模式时，返回该应用的绑定域名 URL；
     * 否则返回原始路径。
     *
     * @param string $path 菜单路径
     * @param \App\Models\AdminMenu|null $menu 菜单对象（可选，用于域名模式判断）
     */
    function menu_path(string $path, ?object $menu = null): string
    {
        if (!$path || $path === '#') {
            return '#';
        }

        if (str_starts_with($path, '//') || str_starts_with($path, 'http')) {
            return $path;
        }

        // 检查菜单所属应用是否为域名绑定模式
        if ($menu && isset($menu->app_id) && $menu->app_id && $menu->terminal_type === 'home') {
            try {
                $accessModeCode = 'app_' . str_replace('.', '_', $menu->app_id) . '_access_mode';
                $accessMode = \App\Models\ConfigItem::where('code', $accessModeCode)
                    ->where('status', \App\Enums\Status::ENABLED)
                    ->value('value');

                if ($accessMode === 'domain') {
                    $domainCode = 'app_' . str_replace('.', '_', $menu->app_id) . '_access_domain';
                    $domain = \App\Models\ConfigItem::where('code', $domainCode)
                        ->where('status', \App\Enums\Status::ENABLED)
                        ->value('value');

                    if ($domain) {
                        $scheme = request()->isSecure() ? 'https' : 'http';
                        return rtrim($scheme . '://' . $domain, '/') . '/';
                    }
                }
            } catch (\Throwable) {
            }
        }

        // 非域名绑定应用：在子域名上时生成主站绝对URL，避免被 catch-all 拦截
        return main_url(ltrim($path, '/'));
    }
}

/**
 * app_id → 目录名 / 命名空间片段（驼峰拼接）
 * 兼容旧格式和新格式
 * onlinepay       → Onlinepay
 * cmspro.blog     → CmsproBlog
 */
function app_id_to_class_name(string $appId): string
{
    $parts = explode('.', $appId);
    return implode('', array_map('ucfirst', $parts));
}

/**
 * app_id → 数据库表前缀
 * onlinepay       → app_onlinepay_
 * cmspro.blog     → app_cmspro_blog_
 */
function app_id_to_table_prefix(string $appId): string
{
    return 'app_' . str_replace('.', '_', $appId) . '_';
}

/**
 * app_id → 路由前缀
 * onlinepay       → onlinepay
 * cmspro.blog     → cmspro/blog
 */
function app_id_to_route_prefix(string $appId): string
{
    return str_replace('.', '/', $appId);
}
