import { z } from 'zod';
import type { ProviderType } from '../provider/types.js';

// Re-export ProviderType from provider module
export type { ProviderType } from '../provider/types.js';

// 内容块类型（支持多模态）
export interface TextContentBlock {
  type: 'text';
  text: string;
}

export interface ImageContentBlock {
  type: 'image';
  /** base64 编码的图片数据 */
  image: string;
  /** MIME 类型 */
  mimeType?: string;
}

export type ContentBlock = TextContentBlock | ImageContentBlock;

// 消息类型（支持多模态）
export interface Message {
  role: 'user' | 'assistant';
  /** 内容可以是纯文本或内容块数组 */
  content: string | ContentBlock[];
}

// 用户输入（带图片）
export interface UserInput {
  /** 文本内容 */
  text: string;
  /** 图片列表（base64 编码） */
  images?: Array<{
    data: string;
    mimeType: string;
    filename?: string;
  }>;
}

// 工具参数定义
export interface ToolParameter {
  type: 'string' | 'number' | 'boolean' | 'array' | 'object';
  description: string;
  required?: boolean;
}

// 工具执行结果
export interface ToolResult {
  success: boolean;
  output: string;
  error?: string;
  /** 额外的元数据（可选） */
  metadata?: Record<string, unknown>;
}

// 工具定义（兼容 Vercel AI SDK 的 tool 格式）
export interface Tool {
  name: string;
  description: string;
  parameters: Record<string, ToolParameter>;
  execute: (params: Record<string, unknown>) => Promise<ToolResult>;
}

// 工具调用请求
export interface ToolCall {
  name: string;
  input: Record<string, unknown>;
}

// Agent 配置
export interface AgentConfig {
  provider: ProviderType;
  apiKey: string;
  model: string;
  maxTokens: number;
  systemPrompt: string;
  /** 自定义 API 基础 URL（用于兼容 OpenAI API 的第三方服务，如阿里云百炼） */
  baseUrl?: string;
  /** 模型的上下文窗口大小（tokens），用于压缩管理 */
  contextWindow?: number;
}

// 会话上下文
export interface ConversationContext {
  messages: Message[];
  workingDirectory: string;
}

// Chat 返回结果（包含完整的消息链）
export interface ChatResult {
  /** 最终文本响应 */
  text: string;
  /** 完整的响应消息链（包含 tool-call 和 tool-result） */
  messages: unknown[];
}

// 将自定义 Tool 转换为 Vercel AI SDK 的 zod schema
export function buildZodSchema(parameters: Record<string, ToolParameter>): z.ZodObject<Record<string, z.ZodTypeAny>> {
  const schemaObj: Record<string, z.ZodTypeAny> = {};

  for (const [key, param] of Object.entries(parameters)) {
    let fieldSchema: z.ZodTypeAny;

    switch (param.type) {
      case 'string':
        fieldSchema = z.string().describe(param.description);
        break;
      case 'number':
        fieldSchema = z.number().describe(param.description);
        break;
      case 'boolean':
        fieldSchema = z.boolean().describe(param.description);
        break;
      case 'array':
        fieldSchema = z.array(z.unknown()).describe(param.description);
        break;
      case 'object':
        fieldSchema = z.record(z.string(), z.unknown()).describe(param.description);
        break;
      default:
        fieldSchema = z.unknown().describe(param.description);
    }

    if (!param.required) {
      fieldSchema = fieldSchema.optional();
    }

    schemaObj[key] = fieldSchema;
  }

  return z.object(schemaObj);
}
