/**
 * Copyright (c) 2023 - present TinyEngine Authors.
 * Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd.
 *
 * Use of this source code is governed by an MIT-style license.
 *
 * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
 * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
 * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
 *
 */

import { getMetaApi, META_SERVICE } from '@opentiny/tiny-engine-meta-register'
import type { LLMRequestBody, RequestOptions } from '../types'

/**
 * AI聊天相关API
 */
export const aiChatApi = {
  /**
   * 聊天补全请求
   * @param body 请求体
   * @param options 请求选项
   */
  chatCompletions: (body: LLMRequestBody, options: RequestOptions = {}) => {
    return getMetaApi(META_SERVICE.Http).post(options?.url || 'app-center/api/chat/completions', body, {
      headers: {
        'Content-Type': 'application/json',
        ...options?.headers
      }
    })
  },

  /**
   * Agent聊天请求
   * @param body 请求体
   * @param options 请求选项
   */
  agentChat: (body: LLMRequestBody, options: RequestOptions = {}) => {
    return getMetaApi(META_SERVICE.Http).post('app-center/api/ai/chat', body, {
      headers: {
        'Content-Type': 'application/json',
        ...options?.headers
      }
    })
  },

  /**
   * AI搜索请求
   * @param content 搜索内容
   */
  aiSearch: (content: string): Promise<Array<{ score: number; content: string; doc_name: string }>> => {
    return getMetaApi(META_SERVICE.Http).post('app-center/api/ai/search', { content })
  }
}

interface Resource {
  id: string
  name: string
  description: string | null
  resourceUrl: string
  resourceData: string
  thumbnailUrl: string
  thumbnailData: string
}

interface ResourceGroup {
  id: string
  name: string
  description: string | null
  resources: Array<Resource>
}

type ResourceGroupList = Array<ResourceGroup>

/**
 * 资源管理相关API
 */
export const resourceApi = {
  /**
   * 上传文件
   * @param formData 文件表单数据
   */
  uploadFile: (formData: FormData): Promise<Resource> => {
    return getMetaApi(META_SERVICE.Http).post('material-center/api/resource/upload', formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    })
  },

  /**
   * 获取资源列表
   * @param appId 应用ID
   */
  getResourceList: (appId: string): Promise<ResourceGroupList> => {
    return getMetaApi(META_SERVICE.Http).get(`material-center/api/resource-group/${appId}`)
  },

  /**
   * 获取资源列表
   * @param groupId 组ID
   */
  getResourceListByGroup: (groupId: string): Promise<ResourceGroup> => {
    return getMetaApi(META_SERVICE.Http).get(`material-center/api/resource/find/${groupId}`)
  }
}

/**
 * HTTP客户端相关API
 */
export const httpApi = {
  /**
   * 获取HTTP客户端
   */
  getHttpClient: () => {
    return getMetaApi(META_SERVICE.Http)?.getHttp()
  }
}

export const encryptApi = {
  encryptKey: (apiKey: string): Promise<{ token: string }> =>
    getMetaApi(META_SERVICE.Http).post('app-center/api/encrypt-key', { apiKey })
}

export const apiService = {
  ...aiChatApi,
  ...resourceApi,
  ...httpApi,
  ...encryptApi
}

export default apiService