import * as axios7 from "axios";
import * as axios0 from "axios";
import * as axios12 from "axios";
import * as axios15 from "axios";
import { AxiosInstance } from "axios";

//#region src/utils/streamResponse/handler/type.d.ts
type EventType = 'workflow_started' | 'workflow_finished' | 'node_started' | 'node_finished' | 'message' | 'message_file' | 'message_end' | 'tts_message' | 'tts_message_end' | 'text_chunk' | 'message_replace' | 'error';
interface BaseEvent<T extends EventType> {
  event: T;
  task_id: string;
}
interface WorkflowStartedEvent extends BaseEvent<'workflow_started'> {
  workflow_run_id: string;
  data: {
    id: string;
    workflow_id: string;
    sequence_number: number;
    created_at: number;
  };
}
interface WorkflowFinishedEvent extends BaseEvent<'workflow_finished'> {
  workflow_run_id: string;
  data: {
    id: string;
    workflow_id: string;
    outputs: Record<string, unknown>;
    status: Status;
    error: string;
    elapsed_time: number;
    total_tokens: number;
    total_steps: string;
    created_at: number;
    finished_at: number;
  };
}
interface NodeStartedEvent extends BaseEvent<'node_started'> {
  workflow_run_id: string;
  data: {
    id: string;
    node_id: string;
    node_type: string;
    title: string;
    index: number;
    predecessor_node_id: string;
    inputs: AnyObject;
    created_at: number;
  };
}
interface NodeFinishedEvent extends BaseEvent<'node_finished'> {
  workflow_run_id: string;
  data: {
    id: string;
    node_id: string;
    node_type: string;
    title: string;
    index: number;
    predecessor_node_id: string;
    process_data?: AnyObject;
    inputs: AnyObject;
    outputs?: AnyObject;
    status: Status;
    error: string;
    elapsed_time?: number;
    execution_metadata: {
      total_tokens?: number;
      total_price?: number;
      currency?: string;
    };
    created_at: number;
  };
}
interface MessageEvent extends BaseEvent<'message'> {
  message_id: string;
  conversation_id: string;
  answer: string;
  created_at: number;
}
interface MessageFileEvent extends BaseEvent<'message_file'> {
  conversation_id: string;
  type: string;
  belongs_to: 'assistant';
  url: string;
}
interface MessageEndEvent extends BaseEvent<'message_end'> {
  id: string;
  message_id: string;
  conversation_id: string;
  metadata: {
    usage: Usage;
    retriever_resources?: RetrieverResource[];
  };
}
interface TTSMessageEvent extends BaseEvent<'tts_message'> {
  message_id: string;
  audio: string;
  created_at: number;
}
interface TTSMessageEndEvent extends BaseEvent<'tts_message_end'> {
  message_id: string;
  audio: '';
  created_at: number;
}
interface TextChunkEvent extends BaseEvent<'text_chunk'> {
  workflow_run_id: string;
  data: {
    text: string;
    from_variable_selector: string[];
  };
}
interface MessageReplaceEvent extends BaseEvent<'message_replace'> {
  message_id: string;
  conversation_id: string;
  answer: string;
  created_at: number;
}
interface ErrorEvent extends BaseEvent<'error'> {
  error: string;
  message_id: string;
  status: number;
  code: string;
  message: string;
}
type ChatStreamEvent = WorkflowStartedEvent | WorkflowFinishedEvent | NodeStartedEvent | NodeFinishedEvent | MessageEvent | MessageFileEvent | MessageEndEvent | TTSMessageEvent | TTSMessageEndEvent | ErrorEvent;
type WorkflowStreamEvent = WorkflowStartedEvent | NodeStartedEvent | TextChunkEvent | NodeFinishedEvent | WorkflowFinishedEvent | TTSMessageEvent | TTSMessageEndEvent;
type CompletionStreamEvent = MessageEvent | MessageEndEvent | TTSMessageEvent | TTSMessageEndEvent | MessageReplaceEvent | ErrorEvent; //#endregion
//#region src/utils/streamResponse/handler/base.d.ts
/**
 * 通用错误处理器
 */
type ErrorHandler = (error: Error) => void;
/**
 * 完成处理器
 */
type CompletionHandler = () => void;
/**
 * 事件处理器类型
 */
type EventHandler<T extends BaseEvent<EventType>> = (event: T) => void;
/**
 * 基础流处理器 - 提供通用的流处理机制
 */
declare abstract class BaseStreamHandler<T extends BaseEvent<EventType>> {
  protected readonly eventHandlers: Map<EventType, EventHandler<T>[]>;
  protected readonly errorHandlers: ErrorHandler[];
  protected readonly completionHandlers: CompletionHandler[];
  protected readonly stream: NodeJS.ReadableStream;
  protected isStopped: boolean;
  protected isStart: boolean;
  /**
   * 创建流处理器
   * @param stream 响应流对象
   */
  constructor(stream: NodeJS.ReadableStream);
  start(): void;
  /**
   * 处理流内容
   */
  protected processStream(): void;
  /**
   * 处理单条数据
   * @param data 数据字符串
   */
  /**
   * 处理接收到的数据
   */
  protected processData(data: string): void;
  /**
   * 分发事件
   * @param event 事件对象
   */
  protected dispatchEvent(event: T): void;
  /**
   * 触发错误
   * @param error 错误对象
   */
  protected emitError(error: Error): void;
  /**
   * 触发完成
   */
  protected emitCompletion(): void;
  /**
   * 清理资源
   */
  protected cleanUp(): void;
  /**
   * 注册事件处理器
   * @param eventType 事件类型
   * @param handler 处理函数
   */
  protected registerEventHandler<E extends EventType>(eventType: E, handler: EventHandler<any>): void;
  /**
   * 注册错误处理器
   * @param handler 错误处理函数
   */
  onError(handler: ErrorHandler): this;
  /**
   * 注册完成处理器
   * @param handler 完成处理函数
   */
  onFinished(handler: CompletionHandler): this;
  /**
   * 等待流完成
   * @returns Promise 当流完成时解析
   */
  waitForCompletion(): Promise<void>;
}

//#endregion
//#region src/utils/streamResponse/handler/chat.d.ts
/**
 * 聊天流处理器
 */
declare class ChatStreamHandler extends BaseStreamHandler<ChatStreamEvent> {
  /**
   * 注册消息事件处理器
   */
  onMessage(handler: EventHandler<MessageEvent>): this;
  /**
   * 注册消息文件事件处理器
   */
  onMessageFile(handler: EventHandler<MessageFileEvent>): this;
  /**
   * 注册消息结束事件处理器
   */
  onMessageEnd(handler: EventHandler<MessageEndEvent>): this;
  /**
   * 注册文本转语音消息事件处理器
   */
  onTtsMessage(handler: EventHandler<TTSMessageEvent>): this;
  /**
   * 注册文本转语音结束事件处理器
   */
  onTtsMessageEnd(handler: EventHandler<TTSMessageEndEvent>): this;
  /**
   * 注册消息替换事件处理器
   */
  onMessageReplace(handler: EventHandler<MessageReplaceEvent>): this;
  /**
   * 注册错误事件处理器
   */
  onErrorEvent(handler: EventHandler<ErrorEvent>): this;
}

//#endregion
//#region src/utils/streamResponse/handler/completion.d.ts
/**
 * 完成流处理器类型
 */
type CompletionEvent = MessageEvent | MessageEndEvent | TTSMessageEvent | TTSMessageEndEvent | MessageReplaceEvent | ErrorEvent;
/**
 * 完成流处理器
 */
declare class CompletionStreamHandler extends BaseStreamHandler<CompletionEvent> {
  /**
   * 注册消息事件处理器
   */
  onMessage(handler: EventHandler<MessageEvent>): this;
  /**
   * 注册消息结束事件处理器
   */
  onMessageEnd(handler: EventHandler<MessageEndEvent>): this;
  /**
   * 注册文本转语音消息事件处理器
   */
  onTtsMessage(handler: EventHandler<TTSMessageEvent>): this;
  /**
   * 注册文本转语音结束事件处理器
   */
  onTtsMessageEnd(handler: EventHandler<TTSMessageEndEvent>): this;
  /**
   * 注册消息替换事件处理器
   */
  onMessageReplace(handler: EventHandler<MessageReplaceEvent>): this;
  /**
   * 注册错误事件处理器
   */
  onErrorEvent(handler: EventHandler<ErrorEvent>): this;
}

//#endregion
//#region src/utils/streamResponse/handler/workflow.d.ts
/**
 * 工作流流处理器
 */
declare class WorkflowStreamHandler extends BaseStreamHandler<WorkflowStreamEvent> {
  /**
   * 注册工作流开始事件处理器
   */
  onWorkflowStarted(handler: EventHandler<WorkflowStartedEvent>): this;
  /**
   * 注册工作流完成事件处理器
   */
  onWorkflowFinished(handler: EventHandler<WorkflowFinishedEvent>): this;
  /**
   * 注册节点开始事件处理器
   */
  onNodeStarted(handler: EventHandler<NodeStartedEvent>): this;
  /**
   * 注册节点完成事件处理器
   */
  onNodeFinished(handler: EventHandler<NodeFinishedEvent>): this;
  /**
   * 注册文本块事件处理器
   */
  onTextChunk(handler: EventHandler<TextChunkEvent>): this;
  /**
   * 注册文本转语音消息事件处理器
   */
  onTtsMessage(handler: EventHandler<TTSMessageEvent>): this;
  /**
   * 注册文本转语音结束事件处理器
   */
  onTtsMessageEnd(handler: EventHandler<TTSMessageEndEvent>): this;
}

//#endregion
//#region src/client/type.d.ts
interface Usage {
  prompt_tokens: number;
  prompt_unit_price: string;
  prompt_price_unit: string;
  prompt_price: string;
  completion_tokens: number;
  completion_unit_price: string;
  completion_price_unit: string;
  completion_price: string;
  total_tokens: number;
  total_price: string;
  currency: string;
  latency: number;
}
interface RetrieverResource {
  id: string;
  content: string;
  source?: string;
  score?: number;
  metadata?: Record<string, unknown>;
}
/** inputs var */
type AnyObject = Record<string, any>;
type Status = 'running' | 'succeeded' | 'failed' | 'stopped';
type ResponseModeType = 'streaming' | 'blocking';
type FeedbackRating = 'like' | 'dislike' | null;
/**
 * 用户标识
 * @description 不管是什么类型，最终都会被dify的 python代码 转换为字符串
 */
type User<T = any> = T;
type AppParameters = {
  opening_statement: string;
  suggested_questions: string[];
  suggested_questions_after_answer: {
    enable: boolean;
  };
  speech_to_text: {
    enable: boolean;
  };
  text_to_speech: {
    enable: boolean;
    voice: string;
    language: string;
    autoPlay: 'disabled' | 'enabled';
  };
  retriever_resource: {
    enable: boolean;
  };
  annotation_reply: {
    enable: boolean;
  };
  user_input_form: [{
    'text-input': {
      label: string;
      variable: string;
      required: boolean;
      max_length: number;
      default: '';
    };
  }, {
    paragraph: {
      label: string;
      variable: string;
      required: boolean;
      default: '';
    };
  }, {
    select: {
      label: string;
      variable: string;
      required: boolean;
      default: string;
      options: string[];
    };
  }];
  file_upload: {
    image: {
      enabled: boolean;
      number_limits: number;
      transfer_methods: string[];
    };
    allowed_file_types: string[];
    allowed_file_extensions: string[];
    allowed_file_upload_methods: string[];
    number_limits: number;
    fileUploadConfig: {
      file_size_limit: number;
      batch_count_limit: number;
      image_file_size_limit: number;
      video_file_size_limit: number;
      audio_file_size_limit: number;
      workflow_file_upload_limit: number;
    };
  };
  system_parameters: {
    image_file_size_limit: number;
    video_file_size_limit: number;
    audio_file_size_limit: number;
    file_size_limit: number;
    workflow_file_upload_limit: number;
  };
};
interface AppMeta {
  tool_icons: {
    [key: string]: string | {
      background: string;
      content: string;
    };
  };
}
interface FileUploadResponse {
  id: string;
  name: string;
  size: number;
  extension: string;
  mime_type: string;
  created_by: string;
  created_at: number;
  preview_url: string | null;
}
interface VisionFile {
  type: 'document' | 'image' | 'audio' | 'video' | 'custom';
  name: string;
  transfer_method: 'remote_url' | 'local_file';
  /** 当transfer_method为remote_url时，url为必填 */
  url?: string;
  /** 当transfer_method为local_file时，upload_file_id为必填 */
  upload_file_id?: string;
}
interface ChatMessageParams<T extends ResponseModeType = 'blocking'> {
  inputs?: AnyObject;
  query: string;
  user: string;
  conversation_id?: string;
  files?: VisionFile[];
  response_mode?: T;
  auto_generate_name?: boolean;
}
type ChatResponseType<T extends ResponseModeType> = T extends 'streaming' ? ChatStreamHandler : ChatCompletionResponse;
interface ChatCompletionResponse {
  event: 'message';
  task_id: string;
  id: string;
  message_id: string;
  conversation_id: string;
  mode: 'chat';
  answer: string;
  metadata: {
    usage: Usage;
    retriever_resources: RetrieverResource[];
  };
  created_at: number;
}
type ChatCompletionChunkResponse = string;
type SuggestedResponse = {
  result: 'success';
  data: string[];
};
type RenameConversationParams = {
  conversation_id: string;
  name?: string;
  user: User;
  /** default false */
  auto_generate?: boolean;
};
type RenameConversationResponse = {
  id: string;
  name: string;
  inputs: AnyObject;
  status: 'normal' | string;
  introduction: string;
  created_at: number;
  updated_at: number;
};
type DeleteConversationParams = {
  conversation_id: string;
  user: User;
};
type DeleteConversationResponse = {
  result: 'success';
};
type ConversationParams = {
  user: User;
  last_id?: string;
  /** int_range(1, 100), default 20 */
  limit?: number;
  /** default -updated_at */
  sort_by?: 'created_at' | '-created_at' | 'updated_at' | '-updated_at';
};
type Conversations = {
  id: string;
  inputs: AnyObject;
  introduction: string;
  name: string;
  status: 'normal' | string;
  created_at: number;
  updated_at: number;
};
type ConversationResponse = {
  limit: number;
  has_more: boolean;
  data: Conversations[];
};
type ConversationMessageParams = {
  user: User;
  conversation_id: string;
  last_id?: string;
  /** int_range(1, 100), default 20 */
  limit?: number;
};
type Message = {
  agent_thoughts: [];
  answer: string;
  conversation_id: string;
  created_at: number;
  error: null;
  feedback: FeedbackRating | null;
  id: string;
  inputs: AnyObject;
  message_files: {
    id: string;
    type: 'image' | string;
    url: string;
    belongs_to: 'assistant' | 'user';
  }[];
  metadata: Record<string, any>;
  parent_message_id: string | null;
  query: string;
  retriever_resources: RetrieverResource[];
  status: 'normal' | string;
};
type ConversationMessageResponse = {
  limit: number;
  has_more: boolean;
  data: Message[];
};
type RunWorkflowParams<T extends ResponseModeType = 'blocking'> = {
  inputs?: Record<string, any | VisionFile[]>;
  user: User;
  response_mode?: T;
};
interface WorkflowCompletionResponse {
  workflow_run_id: string;
  task_id: string;
  data: {
    id: string;
    workflow_id: string;
    status: Status;
    outputs?: AnyObject;
    error?: string;
    elapsed_time?: number;
    total_tokens?: number;
    total_steps: number;
    created_at: number;
    finished_at: number;
  };
}
type WorkflowResponse<T extends ResponseModeType> = T extends 'streaming' ? WorkflowStreamHandler : WorkflowCompletionResponse;
type WorkflowRunStatus = 'succeeded' | 'failed' | 'stopped';
type GetLogsParams = {
  keyword?: string;
  status?: WorkflowRunStatus;
  page?: number;
  limit?: number;
};
type WorkflowLog = {
  id: string;
  workflow_run: {
    id: string;
    version: string;
    status: WorkflowRunStatus;
    error: string | null;
    elapsed_time: number;
    total_tokens: number;
    total_steps: number;
    created_at: number;
    finished_at: number;
  };
  created_from: string;
  created_by_role: string;
  created_by_account: string | null;
  created_by_end_user: {
    id: string;
    type: string;
    is_anonymous: boolean;
    session_id: string;
  };
  created_at: number;
};
type WorkflowLogResponse = {
  page: number;
  limit: number;
  total: number;
  has_more: boolean;
  data: WorkflowLog[];
};
type CreateCompletionMessageParams<T extends ResponseModeType = 'blocking'> = {
  inputs: {
    query: string;
    [key: string]: any;
  };
  user: User;
  files?: VisionFile[];
  response_mode?: T;
};
type CompletionResponse<T extends ResponseModeType> = T extends 'streaming' ? CompletionStreamHandler : CompletionCompletionResponse;
interface CompletionCompletionResponse {
  event: 'message';
  task_id: string;
  id: string;
  message_id: string;
  conversation_id: string;
} //#endregion
//#region src/client/dify.d.ts
/**
 * Dify API Base Class
 */
declare class DifyClient {
  protected apiKey: string;
  protected baseUrl: string;
  protected request: AxiosInstance;
  /**
   * Create Dify Client Instance
   * @param apiKey API Key
   * @param baseUrl API Base URL, default to official API address
   */
  constructor(apiKey: string, baseUrl?: string);
  messageFeedback(messageId: string, rating: FeedbackRating, user: User): Promise<axios7.AxiosResponse<{
    result: "success";
  }, any>>;
  getApplicationParameters(): Promise<axios7.AxiosResponse<AppParameters, any>>;
  getMeta(): Promise<axios7.AxiosResponse<AppMeta, any>>;
  fileUpload(file: File, user: string): Promise<axios7.AxiosResponse<FileUploadResponse, any>>;
  /**
   * @deprecated dify 源码中还接受了voice参数，同时源码中貌似并未对streaming参数进行处理
   */
  textToVideo(data: {
    message_id?: string;
    text?: string;
    user: User;
    streaming?: boolean;
  }): Promise<axios7.AxiosResponse<ArrayBuffer, any>>;
}

//#endregion
//#region src/client/chat.d.ts
declare class ChatClient extends DifyClient {
  createChatMessage<T extends ResponseModeType = 'blocking'>(params: ChatMessageParams<T>): Promise<ChatResponseType<T>>;
  getSuggested(messageId: string, user: User): Promise<axios0.AxiosResponse<SuggestedResponse, any>>;
  /**
   * @param taskId get it from chunk response
   * @param user
   */
  stopMessage(taskId: string, user: User): Promise<axios0.AxiosResponse<{
    result: "success";
  }, any>>;
  getConversations(params: ConversationParams): Promise<axios0.AxiosResponse<ConversationResponse, any>>;
  getConversationMessages(params: ConversationMessageParams): Promise<axios0.AxiosResponse<ConversationMessageResponse, any>>;
  renameConversation(data: RenameConversationParams): Promise<axios0.AxiosResponse<RenameConversationResponse, any>>;
  deleteConversation(data: DeleteConversationParams): Promise<axios0.AxiosResponse<{
    result: "success";
  }, any>>;
  /**
   * @param file file support ["mp3", "m4a", "wav", "webm", "amr"], limit 15MB
   * @param user 用户
   */
  audioToText(file: File, user: User): Promise<axios0.AxiosResponse<{
    text: string;
  }, any>>;
}

//#endregion
//#region src/client/workflow.d.ts
declare class WorkflowClient extends DifyClient {
  run<T extends ResponseModeType = 'blocking'>(data: RunWorkflowParams<T>): Promise<WorkflowResponse<T>>;
  getRunDetail(workflowRunId: string): Promise<axios12.AxiosResponse<any, any>>;
  stop(taskId: string, user: User): Promise<axios12.AxiosResponse<{
    result: "success";
  }, any>>;
  getLogs(params: GetLogsParams): Promise<axios12.AxiosResponse<WorkflowLogResponse, any>>;
}

//#endregion
//#region src/client/completion.d.ts
declare class CompletionClient extends DifyClient {
  createCompletionMessage<T extends ResponseModeType = 'blocking'>(data: CreateCompletionMessageParams<T>): Promise<CompletionResponse<T>>;
  stop(taskId: string, user: User): Promise<axios15.AxiosResponse<{
    result: "success";
  }, any>>;
}

//#endregion
export { AnyObject, AppMeta, AppParameters, BaseEvent, ChatClient, ChatCompletionChunkResponse, ChatCompletionResponse, ChatMessageParams, ChatResponseType, ChatStreamEvent, CompletionClient, CompletionCompletionResponse, CompletionResponse, CompletionStreamEvent, ConversationMessageParams, ConversationMessageResponse, ConversationParams, ConversationResponse, Conversations, CreateCompletionMessageParams, DeleteConversationParams, DeleteConversationResponse, DifyClient, ErrorEvent, EventType, FeedbackRating, FileUploadResponse, GetLogsParams, Message, MessageEndEvent, MessageEvent, MessageFileEvent, MessageReplaceEvent, NodeFinishedEvent, NodeStartedEvent, RenameConversationParams, RenameConversationResponse, ResponseModeType, RetrieverResource, RunWorkflowParams, Status, SuggestedResponse, TTSMessageEndEvent, TTSMessageEvent, TextChunkEvent, Usage, User, VisionFile, WorkflowClient, WorkflowCompletionResponse, WorkflowFinishedEvent, WorkflowLog, WorkflowLogResponse, WorkflowResponse, WorkflowRunStatus, WorkflowStartedEvent, WorkflowStreamEvent };