import { Type, Static } from '@sinclair/typebox';
import OpenAI from 'openai';
import { type AnyAgentTool, textResult } from '../common.js';
import { registerSchema } from '../catalog.js';

const DEFAULT_PROMPT = `你是一个专业的图像分析助手。请按以下步骤分析图片：
1. **图像分类**：首先识别图片类型（如：身份证、驾驶证、行驶证、营业执照、发票、商品图片、截图、照片、表格、图表、手写文字、印刷文字等）。
2. **结构化提取**：根据图片类型，提取关键信息：
   - 证件类：提取所有字段（姓名、证件号、有效期、地址等）
   - 票据类：提取金额、日期、项目明细等
   - 商品类：提取品名、规格、价格、品牌等
   - 表格/图表类：提取数据结构和关键数值
   - 其他类：详细描述画面内容
3. **详细描述**：对图片内容进行全面、详细的文字描述，不遗漏任何可见信息。
4. **质量评估**：简要说明图片清晰度、是否有遮挡或模糊区域。
请以结构化格式输出分析结果。`;

const Params = Type.Object({
  image: Type.String({ description: '图片URL或base64编码字符串' }),
  prompt: Type.Optional(Type.String({ description: '分析提示词' })),
});

export interface ImageRecognizeCredentials {
  baseUrl: string;
  apiKey: string;
  supplier: string;
  modelId: string;
  promptHint: string | null;
}

async function normalizeImageInput(image: string): Promise<string> {
  if (image.startsWith('data:')) {
    return image;
  }

  if (image.startsWith('http://127.0.0.1') || image.startsWith('http://localhost') || image.startsWith('https://127.0.0.1') || image.startsWith('https://localhost')) {
    const response = await fetch(image);
    if (!response.ok) {
      throw new Error(`图片下载失败: ${response.status} ${response.statusText}`.trim());
    }
    const mimeType = response.headers.get('content-type') || 'image/png';
    const buffer = Buffer.from(await response.arrayBuffer());
    return `data:${mimeType};base64,${buffer.toString('base64')}`;
  }

  if (image.startsWith('http')) {
    return image;
  }

  return `data:image/png;base64,${image}`;
}

export function createImageRecognizeTool(creds: ImageRecognizeCredentials): AnyAgentTool {
  return {
    name: 'image_recognize',
    label: '图片识别',
    description: '分析图片内容，支持证件识别、OCR、商品识别等。传入图片URL或base64。',
    parameters: Params,
    async execute(_id: string, params: Static<typeof Params>) {
      const systemPrompt = creds.promptHint || DEFAULT_PROMPT;
      const userPrompt = params.prompt
        ? `${systemPrompt}\n\n用户补充要求：${params.prompt}`
        : systemPrompt;

      const imageUrl = await normalizeImageInput(params.image);

      // 直接使用 OpenAI 兼容协议（支持多模态 content 数组）
      const client = new OpenAI({ apiKey: creds.apiKey, baseURL: creds.baseUrl });

      const response = await client.chat.completions.create({
        model: creds.modelId,
        messages: [
          {
            role: 'user',
            content: [
              { type: 'text', text: userPrompt },
              { type: 'image_url', image_url: { url: imageUrl } },
            ],
          },
        ],
        max_tokens: 4096,
      });

      const content = response.choices?.[0]?.message?.content ?? '模型未返回内容';
      return textResult(content);
    },
  };
}

registerSchema({
  name: 'image_recognize',
  toolset: 'vision',
  description: '分析图片内容，支持证件识别、OCR、商品识别等。',
  capability: 'text',
  visibility: 'tool',
  isCore: false,
  canDisable: true,
  supportsPromptHint: true,
  requiresModel: true,
});
