import { request } from '../http'

export type EvaluationDimensionKey = 'satisfied' | 'normal' | 'unsatisfied'

export interface EvaluationTagItem {
  id: string
  labelContent: string
  createBy: string
  createTime: string
  updateTime: string
  status: 0 | 1
  sortOrder: number
}

export interface EvaluationTagPageQuery {
  evaluateDimension: 1 | 2 | 3
  pageNum: number
  pageSize: number
  status?: 0 | 1
  tagContent?: string
  createBy?: string
  createTimeStart?: string
  createTimeEnd?: string
}

export interface EvaluationTagListItem {
  createBy?: string
  createTime?: string
  deleted?: boolean
  evaluateDimension?: number
  evaluateDimensionName?: string
  id: number | string
  sortOrder?: number
  status?: 0 | 1
  statusName?: string
  tagContent?: string
  updateBy?: string
  updateTime?: string
}

export interface SaveOrUpdateEvaluationTagData {
  evaluateDimension: 1 | 2 | 3
  id?: number | string
  status: 0 | 1
  tagContent: string
}

export interface UpdateEvaluationTagStatusData {
  id: number | string
  status: 0 | 1
}

export interface UpdateEvaluationTagSortItem {
  id: number | string
  sortOrder: number
}

export interface EvaluationDimensionConfig {
  key: EvaluationDimensionKey
  label: string
  maxEnabledCount: number
  tags: EvaluationTagItem[]
}

export interface EvaluationTagConfig {
  popupEnabled: 0 | 1
  dimensions: Record<EvaluationDimensionKey, EvaluationDimensionConfig>
}

export function fetchEvaluationTagPageList(data: EvaluationTagPageQuery) {
  return request.Post<Service.ResponseResult<{
    current: number
    hasNextPage: boolean
    hasPrevPage: boolean
    pages: number
    records: Array<{
      createBy: string
      createTime: string
      deleted: boolean
      evaluateDimension: number
      evaluateDimensionName: string
      id: number | string
      sortOrder: number
      status: 0 | 1
      statusName: string
      tagContent: string
      updateBy: string
      updateTime: string
    }>
    size: number
    startIndex: number
    total: number
  }>>('/operation/api/v1/evaluateTag/pageList', data)
}

export function fetchAllEvaluationTags() {
  return request.Post<Service.ResponseResult<EvaluationTagListItem[]>>('/operation/api/v1/evaluateTag/getAllXpOrderEvaluateTag')
}

export function saveOrUpdateEvaluationTag(data: SaveOrUpdateEvaluationTagData) {
  return request.Post<Service.ResponseResult<any>>('/operation/api/v1/evaluateTag/saveOrUpdate', data)
}

export function updateEvaluationTagStatus(data: UpdateEvaluationTagStatusData) {
  return request.Post<Service.ResponseResult<any>>('/operation/api/v1/evaluateTag/updateStatus', data)
}

export function updateEvaluationTagSort(data: UpdateEvaluationTagSortItem[]) {
  return request.Post<Service.ResponseResult<any>>('/operation/api/v1/evaluateTag/updateSort', data)
}

export function checkEvaluationTagExists(params: { evaluateDimension: number, tagContent: string, id?: number | string }) {
  return request.Get<Service.ResponseResult<boolean>>('/operation/api/v1/evaluateTag/checkExists', { params })
}
