<?php

namespace Kylin\Modules\Console\Commands;

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

/**
 * 模块详情命令
 *
 * 显示指定模块的详细信息
 */
class ModuleShowCommand extends Command
{
    /**
     * 命令名称和签名
     *
     * @var string
     * 
     * 命令参数说明：
     * 1. {name} - 模块名称（必填）
     *    - 数据类型：字符串
     *    - 用途：指定要显示详情的模块名称
     *    - 示例：php artisan module:show game
     */
    protected $signature = 'module:show {name : 模块名称}';

    /**
     * 命令描述
     *
     * @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');

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

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

        $this->info("模块 [{$name}] 详情：");
        $this->line('');

        $headers = ['属性', '值'];
        $rows = [
            ['名称', $module->getName()],
            ['路径', $module->getPath()],
            ['命名空间', $module->getNamespace()],
            ['状态', $module->isEnabled() ? '启用' : '禁用'],
            ['提供者', implode(', ', $module->get('extra.laravel.providers', []))],
            ['版本', $module->get('version', '未知')],
            ['描述', $module->get('description', '无描述')],
            ['作者', implode(', ', array_map(function($author) {
                return $author['name'] . ($author['email'] ? ' <' . $author['email'] . '>' : '');
            }, $module->get('authors', []))) ?: '未知'],
        ];

        $this->table($headers, $rows);

        $this->line('');
        $this->info('模块文件结构：');
        $this->line('');

        // 显示模块的目录结构
        $this->displayModuleStructure($module->getPath());

        return 0;
    }

    /**
     * 显示模块的目录结构
     *
     * @param  string  $path  模块路径
     * @param  int  $depth  目录深度
     */
    protected function displayModuleStructure(string $path, int $depth = 0): void
    {
        $filesystem = $this->laravel['files'];
        
        if (!$filesystem->isDirectory($path)) {
            return;
        }

        $files = $filesystem->files($path);
        $directories = $filesystem->directories($path);

        // 显示文件
        foreach ($files as $file) {
            $this->line(str_repeat('  ', $depth) . '- ' . $file->getFilename());
        }

        // 显示目录
        foreach ($directories as $directory) {
            $this->line(str_repeat('  ', $depth) . '├─ ' . basename($directory));
            $this->displayModuleStructure($directory, $depth + 1);
        }
    }
}
