<?php

namespace Kylin\Modules\Console\Commands;

use Illuminate\Console\Command;
use Kylin\Modules\ModuleManager;

/**
 * 模块更新命令
 *
 * 用于更新指定的模块
 */
class ModuleUpdateCommand extends Command
{
    /**
     * 命令名称和签名
     *
     * @var string
     * 
     * 命令参数说明：
     * 1. {name} - 模块名称（必填）
     *    - 数据类型：字符串
     *    - 用途：指定要更新的模块名称
     *    - 示例：php artisan module:update game
     * 
     * 命令选项说明：
     * 1. {--force} - 强制更新
     *    - 完整形式：--force
     *    - 用途：强制更新模块，覆盖现有文件
     *    - 示例：php artisan module:update game --force
     */
    protected $signature = 'module:update {name : 模块名称} {--force : 强制更新}';

    /**
     * 命令描述
     *
     * @var string
     */
    protected $description = '更新模块';

    /**
     * 创建新命令实例
     *
     * @param  ModuleManager  $moduleManager  模块管理器实例
     */
    public function __construct(
        private readonly ModuleManager $moduleManager
    ) {
        parent::__construct();
    }

    /**
     * 执行控制台命令
     */
    public function handle(): int
    {
        $name = (string) $this->argument('name');
        $force = (bool) $this->option('force');

        $module = $this->moduleManager->get($name);

        if (!$module) {
            $this->error("模块 [{$name}] 未找到。");
            return 1;
        }

        $this->info("开始更新模块 [{$name}]...");

        try {
            // 在这里实现模块更新逻辑
            // 例如：更新模块的依赖、运行迁移、清除缓存等
            
            // 运行迁移
            $this->call('module:migrate', [
                'module' => $name,
                '--force' => $force,
            ]);

            // 清除模块缓存
            $this->call('module:clear-cache');

            $this->info("模块 [{$name}] 更新成功。");
            return 0;
        } catch (\Exception $e) {
            $this->error("模块 [{$name}] 更新失败: {$e->getMessage()}");
            return 1;
        }
    }
}
