<?php

namespace Kylin\Modules\Console\Commands;

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

/**
 * 模块迁移重置命令
 *
 * 回滚模块的所有迁移
 */
class ModuleMigrateResetCommand extends Command
{
    /**
     * 命令名称和签名
     *
     * @var string
     * 
     * 命令参数说明：
     * 1. {module?} - 模块名称（可选）
     *    - 数据类型：字符串
     *    - 用途：指定要执行迁移重置的模块名称，不指定则执行所有模块的迁移重置
     *    - 示例：php artisan module:migrate-reset game
     * 
     * 命令选项说明：
     * 1. {--database=} - 要使用的数据库连接
     *    - 完整形式：--database
     *    - 数据类型：字符串
     *    - 用途：指定要使用的数据库连接
     *    - 示例：php artisan module:migrate-reset game --database=mysql
     * 
     * 2. {--force} - 在生产环境中强制运行操作
     *    - 完整形式：--force
     *    - 用途：在生产环境中强制运行操作
     *    - 示例：php artisan module:migrate-reset game --force
     * 
     * 3. {--path=} - 要执行的迁移文件路径
     *    - 完整形式：--path
     *    - 数据类型：字符串
     *    - 用途：指定要执行的迁移文件路径
     *    - 示例：php artisan module:migrate-reset game --path=database/migrations
     */
    protected $signature = 'module:migrate-reset {module? : 模块名称} {--database= : 要使用的数据库连接} {--force : 在生产环境中强制运行操作} {--path= : 要执行的迁移文件路径}';

    /**
     * 命令描述
     *
     * @var string
     */
    protected $description = '回滚模块的所有迁移';

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

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

        if (!$moduleName) {
            $this->warn('您必须指定模块名称。');
            return 1;
        }

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

        if (!$module) {
            $this->error("模块 [{$moduleName}] 不存在。");
            return 1;
        }

        $database = $this->option('database');
        $force = (bool) $this->option('force');
        $path = $this->option('path') ?: $module->getPath('database/migrations');

        // 回滚所有迁移
        $this->call('migrate:reset', [
            '--database' => $database,
            '--force' => $force,
            '--path' => $path,
        ]);

        $this->info("模块 [{$moduleName}] 的迁移重置已成功完成！");

        return 0;
    }
}
