<?php

namespace Kylin\Modules\Console\Commands;

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

/**
 * 模块迁移刷新命令
 *
 * 重置并重新运行模块的所有迁移
 */
class ModuleMigrateRefreshCommand extends Command
{
    /**
     * 命令名称和签名
     *
     * @var string
     * 
     * 命令参数说明：
     * 1. {module?} - 模块名称（可选）
     *    - 数据类型：字符串
     *    - 用途：指定要执行迁移刷新的模块名称，不指定则执行所有模块的迁移刷新
     *    - 示例：php artisan module:migrate-refresh game
     * 
     * 命令选项说明：
     * 1. {--database=} - 要使用的数据库连接
     *    - 完整形式：--database
     *    - 数据类型：字符串
     *    - 用途：指定要使用的数据库连接
     *    - 示例：php artisan module:migrate-refresh game --database=mysql
     * 
     * 2. {--force} - 在生产环境中强制运行操作
     *    - 完整形式：--force
     *    - 用途：在生产环境中强制运行操作
     *    - 示例：php artisan module:migrate-refresh game --force
     * 
     * 3. {--path=} - 要执行的迁移文件路径
     *    - 完整形式：--path
     *    - 数据类型：字符串
     *    - 用途：指定要执行的迁移文件路径
     *    - 示例：php artisan module:migrate-refresh game --path=database/migrations
     * 
     * 4. {--seed} - 指示是否应重新运行种子任务
     *    - 完整形式：--seed
     *    - 用途：在迁移后自动填充数据库
     *    - 示例：php artisan module:migrate-refresh game --seed
     * 
     * 5. {--seeder=} - 根种子的类名
     *    - 完整形式：--seeder
     *    - 数据类型：字符串
     *    - 用途：指定根种子的类名
     *    - 示例：php artisan module:migrate-refresh game --seeder=DatabaseSeeder
     * 
     * 6. {--step=} - 重新迁移前回滚的步骤数
     *    - 完整形式：--step
     *    - 数据类型：整数
     *    - 用途：指定重新迁移前回滚的步骤数
     *    - 示例：php artisan module:migrate-refresh game --step=1
     */
    protected $signature = 'module:migrate-refresh {module? : 模块名称} {--database= : 要使用的数据库连接} {--force : 在生产环境中强制运行操作} {--path= : 要执行的迁移文件路径} {--seed : 指示是否应重新运行种子任务} {--seeder= : 根种子的类名} {--step= : 重新迁移前回滚的步骤数}';

    /**
     * 命令描述
     *
     * @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');
        $seed = (bool) $this->option('seed');
        $seeder = $this->option('seeder');
        $step = $this->option('step');

        // 回滚迁移
        $this->call('module:migrate:rollback', [
            'module' => $moduleName,
            '--database' => $database,
            '--force' => $force,
            '--path' => $path,
            '--step' => $step,
        ]);

        // 运行迁移
        $this->call('module:migrate', [
            'module' => $moduleName,
            '--database' => $database,
            '--force' => $force,
            '--path' => $path,
        ]);

        // 如果请求，为数据库填充种子
        if ($seed) {
            $this->call('module:seed', [
                'module' => $moduleName,
                '--database' => $database,
                '--force' => $force,
                '--seeder' => $seeder,
            ]);
        }

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

        return 0;
    }
}
