<?php

namespace Kylin\Modules\Console\Commands;

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

/**
 * 模块状态管理命令
 *
 * 批量管理模块的状态
 */
class ModuleStatusCommand extends Command
{
    /**
     * 命令名称和签名
     *
     * @var string
     * 
     * 命令参数说明：
     * 1. {modules?*} - 模块名称列表（可选）
     *    - 数据类型：字符串数组
     *    - 用途：指定要管理状态的模块名称列表，不指定则应用于所有模块
     *    - 示例：php artisan module:status game user --enable
     * 
     * 命令选项说明：
     * 1. {--enable} - 启用模块
     *    - 完整形式：--enable
     *    - 用途：启用指定的模块
     *    - 示例：php artisan module:status game --enable
     * 
     * 2. {--disable} - 禁用模块
     *    - 完整形式：--disable
     *    - 用途：禁用指定的模块
     *    - 示例：php artisan module:status game --disable
     * 
     * 3. {--toggle} - 切换模块状态
     *    - 完整形式：--toggle
     *    - 用途：切换指定模块的状态（启用变禁用，禁用变启用）
     *    - 示例：php artisan module:status game --toggle
     * 
     * 4. {--all} - 应用于所有模块
     *    - 完整形式：--all
     *    - 用途：将操作应用于所有模块
     *    - 示例：php artisan module:status --all --enable
     */
    protected $signature = 'module:status {modules?* : 模块名称列表} {--enable : 启用模块} {--disable : 禁用模块} {--toggle : 切换模块状态} {--all : 应用于所有模块}';

    /**
     * 命令描述
     *
     * @var string
     */
    protected $description = '批量管理模块的状态';

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

    /**
     * 执行控制台命令
     */
    public function handle(): int
    {
        $modules = $this->argument('modules') ?: [];
        $enable = $this->option('enable');
        $disable = $this->option('disable');
        $toggle = $this->option('toggle');
        $all = $this->option('all');

        // 验证参数
        if (!$enable && !$disable && !$toggle) {
            $this->error('请指定操作：--enable、--disable 或 --toggle');
            return 1;
        }

        if ($enable && $disable) {
            $this->error('不能同时指定 --enable 和 --disable');
            return 1;
        }

        // 确定要操作的模块
        $targetModules = [];
        if ($all) {
            $targetModules = $this->moduleManager->all();
        } elseif (!empty($modules)) {
            foreach ($modules as $moduleName) {
                $module = $this->moduleManager->get($moduleName);
                if ($module) {
                    $targetModules[] = $module;
                } else {
                    $this->warn("模块 [{$moduleName}] 未找到，将被跳过。");
                }
            }
        } else {
            $this->error('请指定模块名称或使用 --all 选项');
            return 1;
        }

        if (empty($targetModules)) {
            $this->error('没有找到要操作的模块');
            return 1;
        }

        // 执行操作
        $this->info('正在处理模块状态...');
        $this->line('');

        $successCount = 0;
        $failureCount = 0;

        foreach ($targetModules as $module) {
            $moduleName = $module->getName();
            $currentStatus = $module->isEnabled() ? '启用' : '禁用';

            try {
                if ($enable) {
                    if ($module->isEnabled()) {
                        $this->info("模块 [{$moduleName}] 已经是启用状态，跳过。");
                        continue;
                    }
                    $module->enable();
                    $newStatus = '启用';
                } elseif ($disable) {
                    if (!$module->isEnabled()) {
                        $this->info("模块 [{$moduleName}] 已经是禁用状态，跳过。");
                        continue;
                    }
                    $module->disable();
                    $newStatus = '禁用';
                } else { // toggle
                    if ($module->isEnabled()) {
                        $module->disable();
                        $newStatus = '禁用';
                    } else {
                        $module->enable();
                        $newStatus = '启用';
                    }
                }

                $this->info("模块 [{$moduleName}] 状态已从 {$currentStatus} 更改为 {$newStatus}");
                $successCount++;
            } catch (\Exception $e) {
                $this->error("处理模块 [{$moduleName}] 时出错: {$e->getMessage()}");
                $failureCount++;
            }
        }

        $this->line('');
        $this->info("操作完成：");
        $this->info("成功: {$successCount}");
        $this->info("失败: {$failureCount}");

        // 清除模块缓存
        $this->call('module:clear-cache');

        return $failureCount > 0 ? 1 : 0;
    }
}
