/*
 * ✨ 请求封装器工具类函数 ✨
 * */

/**
 * 检查并处理分页请求体
 * @param {Object} [body = {}] 分页请求对象
 * @param {Object} [body.pageBean = {}] 分片配置对象
 * @param {Array} [body.querys = []] 查询配置数组
 * @param {Array} [body.sorter = []] 排序配置数组
 * @return {Object} 处理后的分页请求配置对象
 * @example
 * refineRequestBody({pageBean:{},querys:[],sorter:[]})
 * */
export function refineRequestBody(body = {}) {
  // 如果请求体为空对象，则返回空对象
  if (!Object.keys(body).length) return {pageBean: {pageSize: -1}}

  // 辅助函数：判断值是否为空（空字符串、空数组、null 或 undefined）
  const _isEmpty = value =>
    value === '' ||
    (Array.isArray(value) && !value.length) ||
    value === null ||
    value === undefined

  const {pageBean = {pageSize: -1}, querys = [], sorter = []} = body

  return {
    pageBean,
    querys: querys.flatMap(item => {
      const {defaultValue, ...i} = item
      let value = item.value

      if (_isEmpty(value)) {
        // 如果 value 为空，则检查 defaultValue
        value = defaultValue
        // 如果 defaultValue 也为空，则移除该查询对象
        if (_isEmpty(value)) return []
      }

      // 如果为LIKE查询时，处理为字符串格式
      if (i.operation === 'LIKE' && Array.isArray(value)) {
        value = value.join()
      }

      // 返回处理后的查询对象，加入默认属性
      return {
        group: 'main',
        operation: 'EQUAL',
        relation: 'AND',
        ...i,
        value
      }
    }),
    // 过滤掉没有 direction 属性的排序对象
    sorter: sorter.filter(i => i.direction)
  }
}

/**
 * 用于更改后端分页查询配置项中的查询字段值
 * @param {Object} params 分页请求对象
 * @param {Array} params.querys 查询配置数组
 * @param {String} props 字段名
 * @param {any} value 字段值
 * @return void
 * */
export function setQueryValue(params = {}, props = '', value = '') {
  params?.querys?.forEach(i => {
    if (i.property.trim() !== props.trim()) return
    if (this?.$set) {
      this?.$set(i, 'value', value)
    } else {
      i.value = value
    }
  })
}

/**
 * 用于查詢后端分页查询配置项中的字段值
 * @param {Object} params 分页请求对象
 * @param {Array} params.querys 查询配置数组
 * @param {String} props 字段名
 * @return {any} 字段值
 * */
export function getQueryValue(params = {}, props = '') {
  const {value, defaultValue} = params?.querys?.find(
    i => i.property.trim() === props.trim()
  )
  // 辅助函数：判断值是否为空（空字符串、空数组、null 或 undefined）
  const isEmpty = value =>
    value === '' ||
    (Array.isArray(value) && !value.length) ||
    value === null ||
    value === undefined
  let result
  if (isEmpty(value)) {
    if (!isEmpty(defaultValue)) result = defaultValue
  } else {
    result = value
  }
  return result
}

/**
 * 用于查詢后端分页查询配置项中的query绑定元素对象
 * @deprecated 自 ”2024-6-24“ 起废弃，不建议继续使用。
 * @param {Object} params 分页请求对象
 * @param {Array} params.querys 查询配置数组
 * @param {String} props 字段名
 * @return {Object} query绑定元素对象
 * */
export function getQueryItem(params = {}, props = '') {
  const index = params?.querys?.findIndex(
    i => i.property.trim() === props.trim()
  )
  return index !== -1 ? params?.querys[index] : {}
}

/**
 * 用于更改后端分页排序配置项中的排序规则
 * @param {Object} params 分页请求对象
 * @param {String} props 字段名
 * @param {String} direction 排序方式
 * @return void
 * */
export function setSorterDirection(params = {}, props = '', direction = '') {
  params?.sorter?.forEach(i => {
    if (i.property.trim() !== props.trim()) {
      i.direction = ''
    } else {
      i.direction = direction
    }
  })
}

/**
 * 用于查詢后端分页排序配置项中的排序规则
 * @param {Object} params 分页请求对象
 * @param {Array} [params.sorter = []] 排序配置数组
 * @param {Boolean} isNotFullName 排序方式规则字符串是否全称
 * @return {Object} sorter绑定排序对象
 * */
export function getSorterDirection(params = {}, isNotFullName = false) {
  const {sorter = []} = params || {}
  if (!(Array.isArray(sorter) && sorter.length)) return {}
  const {property: prop = '', direction: order = ''} =
    sorter.find(i => i.direction) || {}
  if (!prop) return {}
  const orderOpt = {ASC: 'ascending', DESC: 'descending'}
  return {prop, order: isNotFullName ? orderOpt[order] || '' : order}
}
