import request from '@/service/request'

/**
 * 此函数根据给定的查询参数检索设备列表。
 * @param params - “params”参数是一个“IOT.API.DEVICE.QueryPamars”类型的对象，其中包含 API 请求的查询参数。这些参数用于过滤和分页 API
 * 返回的结果。
 * @returns `getDevice` 函数返回一个解析为 `IOT.API.DEVICE.Device` 对象数组的 Promise。 Promise
 * 由“request”函数返回，该函数使用指定的查询参数（“params”）向“/model/page”端点发出 GET 请求。
 */
export const getDevicePage = (params: IOT.API.DEVICE.QueryPamars) => {
  return request<IOT.API.DEVICE.Device[]>({
    url: '/device/page',
    method: 'GET',
    params
  })
}

export const getDeviceList = (params: {modelId: string, deviceLabel: string, limit: number, lastId: string }) => {
  return request<IOT.API.DEVICE.Device[]>({
    url: '/device/list',
    method: 'GET',
    params
  })
}

export const getDeviceById = (id: string) => {
  return request<IOT.API.DEVICE.Device>({
    url: `/device/${id}`,
    method: 'GET'
  })
}

/**
 *
 * @param id
 * @param authType 设备授权方式
 */
export const getDeviceSecret = (params: {deviceId: string, authType: 'SECRET' | 'X509CERT'}) => {
  return request<string>({
    url: '/deviceSecret',
    method: 'GET',
    params
  })
}

export const addDevice = (data: IOT.API.DEVICE.BodyParams) => {
  return request<string>({
    url: '/device',
    method: 'POST',
    data
  })
}

export const delDevice = (id: string) => {
  return request<string>({
    url: `/device/${id}`,
    method: 'DELETE'
  })
}

export const delDeviceMul = (data: string[]) => {
  return request<string>({
    url: '/device',
    method: 'DELETE',
    data
  })
}

export const updateDeviceLabel = (data: {id: string, deviceLabel: string}) => {
  return request<string>({
    url: '/device/deviceLabel',
    method: 'PUT',
    data
  })
}

export const getSubDeviceList = (id: string, params: IOT.API.DEVICE.QueryPamars) => {
  return request<string>({
    url: `/device/subDevice/${id}`,
    method: 'GET',
    params
  })
}

export const delSubDevice = (id: String) => {
  return request<string>({
    url: `/device/subDevice/${id}`,
    method: 'DELETE'
  })
}

export const addSubDevice = (data: IOT.API.DEVICE.SubBodyParams) => {
  return request<string>({
    url: '/device/subDevice',
    method: 'POST',
    data
  })
}

export const addDeviceTag = (data: IOT.API.DEVICE.DeviceTag[]) => {
  return request<string>({
    url: '/deviceTag',
    method: 'POST',
    data
  })
}

export const getDeviceTag = (params: {deviceId: number | string}) => {
  return request<string>({
    url: '/deviceTag',
    method: 'GET',
    params
  })
}

export const delDeviceTag = (id: string) => {
  return request<string>({
    url: `/deviceTag/${id}`,
    method: 'DELETE'
  })
}

export const getDeviceCount = (params?: {modelId: string}) => {
  return request<IOT.API.DEVICE.Count>({
    url: '/device/count',
    method: 'GET',
    params
  })
}

/**
 * 此函数检索特定设备的消息。
 * @param params - `params` 对象是传递给 `getDeviceMsgPage` 函数的参数。它有一个属性“deviceId”，它是一个表示设备 ID
 * 的字符串。此参数用于向“/toTransport/msg”端点发出 GET 请求以检索与以下内容相关的消息
 * @returns `getDeviceMsgPage` 函数返回一个解析为 `IOT.API.DEVICE.Msg` 类型对象的
 * Promise。根据传入的“deviceId”参数，此对象可能包含有关发送到特定设备的消息的信息。
 */
export const getDeviceMsgList = (params: {deviceId: string}) => {
  return request<IOT.API.DEVICE.Msg[]>({
    url: '/toTransport/msg',
    method: 'GET',
    params
  })
}

// "deviceId": “”设备id 必需
// "msgPayload":"" 消息类容 必需
// "msgLabel"：“”消息名称 必需
// “topic":"" 主题 非必需
/**
 * 该函数向 IoT 系统中的设备添加消息。
 * @param data - `data` 参数是一个包含以下属性的对象：
 * @returns `addDeviceMsg` 函数返回一个解析为 `IOT.API.DEVICE.Msg` 类型对象的 Promise。
 */
export const addDeviceMsg = (data: {deviceId: string, msgPayload: string, msgLabel: string, topic: string}) => {
  return request<IOT.API.DEVICE.Msg>({
    url: '/toTransport/msg',
    method: 'POST',
    data
  })
}

/**
 * 此函数检索特定设备的命令列表。
 * @param params - `params` 参数是一个包含单个属性 `deviceId` 的对象，该属性是表示设备 ID 的字符串。此参数用于向“/toTransport/cmd”端点发出
 * GET 请求以检索消息列表（类型为“IOT.API.DEVICE.Msg”
 * @returns 函数 getDeviceCmdList 返回一个解析为 IOT.API.DEVICE.Msg 对象数组的 Promise。
 */
export const getDeviceCmdList = (params: {deviceId: string}) => {
  return request<IOT.API.DEVICE.Msg[]>({
    url: '/toTransport/cmd',
    method: 'GET',
    params
  })
}

/**
 * 函数“addDeviceCmd”向“/toTransport/cmd”发送一个 POST 请求，其中包含设备 ID、命令标签和命令参数作为数据。
 * @param data - 包含以下属性的对象：
 * @returns `addDeviceCmd` 函数返回一个解析为字符串的 Promise。 Promise
 * 由“request”函数返回，该函数使用提供的“data”对象作为请求主体向“/toTransport/cmd”端点发送 POST 请求。
 */
export const addDeviceCmd = (data: { deviceId: string, cmdLabel: string, cmdParameters: any}) => {
  return request<string>({
    url: '/toTransport/cmd',
    method: 'POST',
    data
  })
}

/**
 * 此函数发送一个 POST 请求以创建一个具有指定标签和上层组 ID 的新设备组。
 * @param data - `data` 参数是一个包含两个属性的对象：
 * @returns `addDeviceGroup` 函数返回一个解析为字符串的 Promise。该字符串是在使用提供的“数据”对象向“/deviceGroup”端点发出 POST 请求后服务器的响应。
 */
export const addDeviceGroup = (data: { groupLabel: string, upperGroupId: string }) => {
  return request<string>({
    url: '/deviceGroup',
    method: 'POST',
    data
  })
}

/**
 * 此函数发送 GET 请求以根据上层组 ID 参数检索设备组列表。
 * @param params - `params` 参数是一个包含 `upperGroupId` 属性的对象。此属性是一个字符串，表示用户要为其检索子组列表的上层设备组的 ID。
 * @returns `listDeviceGroup` 函数返回一个解析为字符串的 Promise。该字符串是使用提供的 params 对象作为查询参数向 `/deviceGroup` 端点发出 GET
 * 请求的响应。
 */
export const listDeviceGroup = (params: { upperGroupId: string }) => {
  return request<string>({
    url: '/deviceGroup',
    method: 'GET',
    params
  })
}

/**
 * 此函数发送 POST 请求以将设备绑定到设备组。
 * @param data - `data` 参数是一个包含两个属性的对象：
 * @returns 函数 postGroupBindDevice 返回一个解析为字符串的 Promise。该字符串是在使用提供的“数据”对象发出 POST 请求后来自 API
 * 端点“/deviceGroup/device”的响应。
 */
export const postGroupBindDevice = (data: { deviceGroupId: string, deviceId: string }[]) => {
  return request<string>({
    url: '/deviceGroup/device',
    method: 'POST',
    data
  })
}
/**
 * 此函数发送 DELETE 请求以从设备组中删除设备。
 * @param data - `data` 参数是一个包含两个属性的对象：
 * @returns 解析为字符串的 Promise。
 */
export const delGroupBindDevice = (data: { deviceGroupId: string, deviceId: string }[]) => {
  return request<string>({
    url: '/deviceGroup/device',
    method: 'DELETE',
    data
  })
}

export const getDeviceByGroup = (params: IOT.API.DEVICE.GroupQueryParams) => {
  return request<IOT.API.DEVICE.Device[]>({
    url: '/device/group',
    method: 'GET',
    params
  })
}

/** 获取设备属性 */
export const getDeviceAttribute = (deviceId: string) => {
  return request<IOT.API.DEVICE.Device[]>({
    url: `/deviceAttribute/latest?deviceId=${deviceId}`,
    method: 'GET'
  })
}

/** 实时数据 */
export const getDevicShadow = (deviceId: string) => {
  return request<IOT.API.DEVICE.Device[]>({
    url: `/deviceAttribute/shadow?deviceId=${deviceId}`,
    method: 'GET'
  })
}

/** 设备拓扑 */
export const getDeviceTopology = (modelId: string) => {
  return request<IOT.API.DEVICE.Topology>({
    url: `/device/topology?modelId=${modelId}`,
    method: 'GET'
  })
}

/** 设备上下线 */
export const getDeviceSession = (params: {deviceId: string, start: number, end: number}) => {
  return request<IOT.API.DEVICE.Session>({
    url: '/deviceAnalysis/session',
    method: 'GET',
    params
  })
}

/** 设备属性 */
export const getDeviceAttributes = (params: {deviceId: string, start: number, end: number}) => {
  return request<IOT.API.DEVICE.Attr>({
    url: '/deviceAnalysis/attributes',
    method: 'GET',
    params
  })
}

/** ota  */
export const getOtaByDeviceId = (deviceId: string) => {
  return request<IOT.API.DEVICE.Ota>({
    url: `/deviceOta/${deviceId}`,
    method: 'GET'
  })
}

export const otaUpgradationRecordByDeviceId = (params: IOT.API.DEVICE.OtaQueryParams) => {
  return request<IOT.API.DEVICE.Ota[]>({
    url: '/deviceOta/page',
    method: 'GET',
    params
  })
}

/** 根据设备id， ota包id来升级设备 */
export const upgradationOtaByDeviceId = (deviceId: string, otaPkgId: string) => {
  return request<string>({
    url: '/deviceOta',
    method: 'POST',
    data: {
      deviceId,
      otaPkgId
    }
  })
}

/** 视频流 */
export const liveById = (deviceId: string) => {
  return request<string>({
    url: `/toTransport/rts/${deviceId}`,
    method: 'POST'
  })
}

/** 视频流通道控制 */
export const liveControlRts = (deviceId: string, channel: number) => {
  return request<string>({
    url: `/toTransport/controlRts/${deviceId}/${channel}`,
    method: 'POST'
  })
}

/** 自定义视频流 */
export const liveCustomRtsUrl = (data: {id: string, rtsUrl: string}) => {
  return request<string>({
    url: '/device/rtsUrl',
    method: 'PUT',
    data
  })
}

// /device/deviceLabel?deviceLabel=xxxx
/** 模糊查询：根据设备名称来查询全部的符合条件的设备名 */
export const getDeviceLabelsByLabel = (deviceLabel: string) => {
  return request<{id: number, deviceLabel: string}[]>({
    url: `/device/deviceLabel?deviceLabel=${deviceLabel}`,
    method: 'GET'
  })
}
