<?php

namespace Kylin\Modules\Console\Commands;

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

/**
 * 执行模块种子命令
 *
 * 用于运行指定模块或所有模块的数据库种子
 */
class ModuleSeedCommand extends Command
{
    /**
     * 命令名称和签名
     *
     * @var string
     * 
     * 命令参数说明：
     * 1. {module?} - 模块名称（可选）
     *    - 数据类型：字符串
     *    - 用途：指定要执行种子的模块名称，不指定则执行所有模块的种子
     *    - 示例：php artisan module:seed game
     * 
     * 命令选项说明：
     * 1. {--class=} - 种子类名
     *    - 完整形式：--class
     *    - 数据类型：字符串
     *    - 用途：指定要执行的种子类名
     *    - 示例：php artisan module:seed game --class=UserSeeder
     */
    protected $signature = 'module:seed {module? : 模块名称} {--class= : 种子类名}';

    /**
     * 命令描述
     *
     * @var string
     */
    protected $description = '执行模块种子';

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

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

        if ($module) {
            $this->seedModule((string) $module, $class ? (string) $class : null);
        } else {
            $this->seedAllModules($class ? (string) $class : null);
        }

        return 0;
    }

    /**
     * 为指定模块执行种子
     *
     * @param  string  $moduleName  模块名称
     * @param  string|null  $class  种子类名
     */
    protected function seedModule(string $moduleName, ?string $class = null): void
    {
        $module = $this->moduleManager->get($moduleName);

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

        $this->info("正在为模块执行种子: {$moduleName}");

        if ($class) {
            $this->call('db:seed', [
                '--class' => $class,
            ]);
        } else {
            $seederClass = $module->getStudlyName() . 'DatabaseSeeder';
            $seederPath = $module->getPath('database/seeders/' . $seederClass . '.php');

            if (file_exists($seederPath)) {
                $this->call('db:seed', [
                    '--class' => $seederClass,
                ]);
            } else {
                $this->info("模块 {$moduleName} 未找到种子类");
            }
        }

        $this->info("模块 [{$moduleName}] 种子执行成功。");
    }

    /**
     * 为所有模块执行种子
     *
     * @param  string|null  $class  种子类名
     */
    protected function seedAllModules(?string $class = null): void
    {
        $modules = $this->moduleManager->all();

        foreach ($modules as $module) {
            $this->seedModule($module->getName(), $class);
        }
    }
}