<?php

namespace Kylin\Modules\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Kylin\Modules\Generators\ModuleGenerator;

/**
 * 创建新模块命令
 *
 * 用于创建新的模块目录和文件结构
 */
class ModuleMakeCommand extends Command
{
    /**
     * 命令名称和签名
     *
     * @var string
     * 
     * 命令参数说明：
     * 1. {name} - 模块名称（必填）
     *    - 数据类型：字符串
     *    - 用途：指定要创建的模块名称
     *    - 示例：php artisan module:make game
     * 
     * 命令选项说明：
     * 1. {--p|plain} - 生成不含资源的纯模块
     *    - 简写：-p
     *    - 完整形式：--plain
     *    - 用途：创建一个只包含基本结构的模块，不生成控制器、模型等资源
     *    - 示例：php artisan module:make game -p
     * 
     * 2. {--f|force} - 强制覆盖已存在的模块
     *    - 简写：-f
     *    - 完整形式：--force
     *    - 用途：当要创建的模块已存在时，强制覆盖它
     *    - 示例：php artisan module:make game -f
     */
    protected $signature = 'module:make {name : 模块名称} {--p|plain : 生成不含资源的纯模块} {--f|force : 强制覆盖已存在的模块}';

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

    /**
     * 创建新命令实例
     *
     * @param  Filesystem  $files  文件系统实例
     */
    public function __construct(
        private readonly Filesystem $files
    ) {
        parent::__construct();
    }

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

        // 标准化模块名称为小写，确保命名空间一致性
        $normalizedName = strtolower($name);

        $generator = new ModuleGenerator(
            $this->laravel,
            $normalizedName,
            [
                'plain' => $plain,
                'force' => $force,
            ]
        );

        $generator->generate();

        $this->info("模块 [{$normalizedName}] 创建成功！");
        $this->info("模块路径: {$generator->getPath()}");
        $this->info("\n后续步骤:");
        $this->info("1. 运行 php artisan module:list 查看所有模块");
        $this->info("2. 运行 php artisan module:migrate {$normalizedName} 执行迁移");
        $this->info("3. 访问 /{$normalizedName} 查看模块");

        return 0;
    }
}