import { Option } from 'commander';
import ora from 'ora';
import { outputSuccess, outputError, isPrettyMode } from '../utils/output.js';
import { info } from '../utils/logger.js';
import { addEnhancedHelp } from '../utils/helpText.js';
import { getConfigValue } from '../services/config.js';
import { GenerationApiClient, GenerationApiError, validateImageParams, fileToBase64, downloadResult, resolveOutputPath, } from '../services/generation-api.js';
// 收集多个 -i 参数
function collect(value, previous) {
    return previous.concat([value]);
}
export function registerImageCommand(program) {
    const cmd = program
        .command('image')
        .description('生成或编辑图像')
        .argument('<prompt>', '图像描述提示词')
        .option('-i, --input <path>', '输入图像路径（可多次使用，最多 8 个）', collect, [])
        .option('-W, --width <px>', '输出宽度 (默认: 1024)')
        .option('-H, --height <px>', '输出高度 (默认: 1024)')
        .option('-s, --seed <number>', '随机种子')
        .option('-f, --format <fmt>', '输出格式: jpeg | png (默认: png)')
        .option('-o, --output <path>', '输出目录')
        .option('--safety <level>', '安全等级 0-5')
        .addOption(new Option('--provider <name>', '图像生成供应商').choices(['bfl', 'grsai']).default('grsai'))
        .option('-m, --model <model>', 'GrsAI 模型: gpt-image-2 | nano-banana-fast | nano-banana-pro | flux-kontext-pro | flux-kontext-max 等')
        .option('--aspect-ratio <ratio>', 'GrsAI 宽高比: 1:1 | 16:9 | 9:16 | 4:3 等')
        .option('--image-size <size>', 'GrsAI nano-banana-pro 输出尺寸: 1K | 2K | 4K')
        .action(async (prompt, options) => {
        const pretty = isPrettyMode(options);
        try {
            const width = options.width ? parseInt(options.width) : undefined;
            const height = options.height ? parseInt(options.height) : undefined;
            // CLI 层快速校验
            validateImageParams({ prompt, width, height });
            // 处理输入图像 → base64
            const inputImages = [];
            if (options.input?.length) {
                for (const imgPath of options.input) {
                    inputImages.push(await fileToBase64(imgPath));
                }
            }
            if (inputImages.length > 8) {
                throw new Error('最多支持 8 张输入图像');
            }
            const params = {
                prompt,
                input_images: inputImages.length > 0 ? inputImages : undefined,
                width,
                height,
                seed: options.seed ? parseInt(options.seed) : undefined,
                output_format: options.format,
                safety_tolerance: options.safety ? parseInt(options.safety) : undefined,
                provider: options.provider,
                model: options.model,
                aspectRatio: options.aspectRatio,
                imageSize: options.imageSize,
            };
            const client = new GenerationApiClient();
            const defaultDir = getConfigValue('outputDir') || './gen-output';
            const spinner = pretty ? ora('正在提交图像生成任务...').start() : null;
            if (pretty)
                spinner.text = '正在生成图像...';
            const result = await client.submitAndPoll('image', params, {
                onProgress: (status) => {
                    if (pretty)
                        spinner.text = `图像生成中 (${status})...`;
                },
            });
            if (result.status === 'completed' && result.result_url) {
                const ext = options.format || 'png';
                const defaultFilename = `image_${result.task_id.slice(0, 8)}.${ext}`;
                const { dir, filename } = resolveOutputPath(options.output, defaultDir, defaultFilename);
                const outputPath = await downloadResult(result.result_url, dir, filename);
                if (pretty) {
                    spinner.succeed('图像生成完成！');
                    info(`输出文件: ${outputPath}`);
                    info(`任务 ID: ${result.task_id}`);
                }
                else {
                    outputSuccess({
                        task_id: result.task_id,
                        status: result.status,
                        output: outputPath,
                        result_url: result.result_url,
                    });
                }
            }
            else {
                // task status != completed → 生成失败。必须走 outputError 使顶层 success:false
                // 并 exit 1，否则 Agent / 上游 Bash 会把 failure 当成 success（已踩坑：
                // CONTENT_POLICY_VIOLATION 被埋在 data 里，Agent 不识别就自己重试）。
                //
                // 前置假设：submitAndPoll 只 yield status ∈ {completed, failed}——任何"非
                // completed"都视为终态失败处理。若未来后端引入 cancelled / partial 等终态，
                // 需要回这里加分支，否则会被笼统报错。
                const errCode = result.error_code ?? 'GENERATION_FAILED';
                const errMsg = result.error_message ?? `任务状态: ${result.status}`;
                if (pretty) {
                    spinner.fail(errMsg);
                    if (result.error_code)
                        info(`错误码: ${result.error_code}${result.retryable ? '（可重试）' : ''}`);
                    info(`使用 'gen task get ${result.task_id}' 查看最新状态`);
                    process.exit(1);
                }
                else {
                    outputError(errCode, errMsg, options, {
                        task_id: result.task_id,
                        status: result.status,
                        retryable: result.retryable ?? false,
                        error_class: result.error_class ?? null,
                    });
                }
            }
        }
        catch (err) {
            if (err instanceof GenerationApiError) {
                outputError(err.code, err.message, options);
            }
            else {
                const message = err instanceof Error ? err.message : String(err);
                outputError('IMAGE_ERROR', message, options);
            }
        }
    });
    addEnhancedHelp(cmd, {
        examples: [
            '# 文生图 (默认 BFL FLUX)',
            '$ gen image "a cute cat sitting on a sofa"',
            '',
            '# 使用 GrsAI gpt-image-2',
            '$ gen image "a cute cat" --provider grsai',
            '',
            '# 使用 GrsAI nano-banana-pro 4K',
            '$ gen image "landscape" --provider grsai -m nano-banana-pro --image-size 4K',
            '',
            '# 使用 GrsAI 指定宽高比',
            '$ gen image "portrait photo" --provider grsai --aspect-ratio 9:16',
            '',
            '# 单图编辑',
            '$ gen image "make it look like watercolor" -i photo.png',
            '',
            '# 多图风格融合',
            '$ gen image "combine styles" -i style.png -i content.png',
            '',
            '# 指定尺寸 (BFL)',
            '$ gen image "landscape" -W 1920 -H 1080',
        ],
        outputJson: `{
  "success": true,
  "data": {
    "task_id": "abc-123-xyz",
    "status": "completed",
    "output": "./gen-output/image_abc123.png",
    "result_url": "https://..."
  }
}`,
        relatedCommands: [
            { command: 'task get <id>', description: '查看任务状态' },
            { command: 'task list --type image', description: '列出图片任务' },
        ],
        notes: [
            '默认使用 BFL FLUX 模型，可通过 --provider grsai 切换到 GrsAI',
            'GrsAI 支持模型: gpt-image-2, nano-banana-fast, nano-banana-pro, flux-kontext-pro 等',
            '需要 Optima 账号（~/.optima/token.json 或 OPTIMA_TOKEN）',
            '支持最多 8 张输入图像用于风格融合和编辑',
        ],
    });
}
//# sourceMappingURL=image.js.map