<?php

namespace Kylin\Licensing;

use Illuminate\Support\ServiceProvider;
use Kylin\Licensing\Commands\LicenseActivateCommand;
use Kylin\Licensing\Commands\LicenseStatusCommand;
use Kylin\Licensing\Http\Middleware\VerifyLicense;
use Kylin\Licensing\Services\LicenseService;
use Kylin\Licensing\Services\LicenseVerifier;

/**
 * 许可证服务提供者
 *
 * 注册软件许可证管理服务，支持：
 *  - 在线激活/停用许可证（通过远程服务器验证）
 *  - 许可证状态查询（有效期、剩余天数、宽限期）
 *  - 许可证中间件（VerifyLicense：路由级许可证校验）
 *  - 控制台命令（license:activate、license:status）
 *
 * 许可证数据缓存于本地，定期与远程服务器同步。
 */
class LicensingServiceProvider extends ServiceProvider
{
    /**
     * 注册服务
     *
     * 合并配置并注册许可证验证器和许可证服务单例。
     */
    public function register(): void
    {
        $this->mergeConfigFrom(
            __DIR__ . '/../config/kylin-licensing.php', 'kylin-licensing'
        );

        $this->app->singleton(LicenseVerifier::class);
        $this->app->singleton(LicenseService::class);
        $this->app->singleton('kylin-licensing', LicenseService::class);
    }

    /**
     * 启动服务
     *
     * 发布配置文件、注册许可证中间件和 API 路由、注册控制台命令。
     */
    public function boot(): void
    {
        $this->publishes([
            __DIR__ . '/../config/kylin-licensing.php' => config_path('kylin-licensing.php'),
        ], 'kylin-licensing-config');

        // 许可证验证中间件：确保请求来源持有有效许可证
        $this->app['router']->aliasMiddleware('kylin.license', VerifyLicense::class);

        $this->loadRoutesFrom(__DIR__ . '/../routes/api.php');

        if ($this->app->runningInConsole()) {
            $this->commands([
                LicenseActivateCommand::class,  // 命令行激活许可证
                LicenseStatusCommand::class,    // 命令行查看许可证状态
            ]);
        }
    }
}
