import { cloneDeep } from 'lodash-es'
import { useEmitt } from '@/hooks/web/useEmitt'
const { emitter } = useEmitt()

export const reRenderAll = (oldArr, newArr) => {
  const newArrIds = newArr.map(ele => ele.id)
  const emitterList = (oldArr || []).reduce((pre, next) => {
    if (newArrIds.includes(next.id)) return pre
    const keyList = getKeyList(next)
    pre = [...new Set([...keyList, ...pre])]
    return pre
  }, [])
  if (!emitterList.length) return
  emitterList.forEach(ele => {
    emitter.emit(`query-data-${ele}`)
  })
}

export const checkFilterRemove = componentTarget => {
  if (componentTarget?.component === 'VQuery') {
    reRenderAfterDelete(componentTarget.propValue)
  } else if (componentTarget.component === 'Group') {
    componentTarget.propValue.forEach(groupItem => {
      checkFilterRemove(groupItem)
    })
  } else if (componentTarget.component === 'DeTabs') {
    componentTarget.propValue.forEach(tabItem => {
      tabItem.componentData?.forEach(tabComponent => {
        checkFilterRemove(tabComponent)
      })
    })
  }
}

export const reRenderAfterDelete = oldArr => {
  const emitterList = (oldArr || []).reduce((pre, next) => {
    const keyList = getKeyList(next)
    pre = [...new Set([...keyList, ...pre])]
    return pre
  }, [])
  if (!emitterList.length) return
  emitterList.forEach(ele => {
    emitter.emit(`query-data-${ele}`)
  })
}

export const getKeyList = next => {
  let checkedFieldsMapArr = Object.entries(next.checkedFieldsMap).filter(ele =>
    next.checkedFields.includes(ele[0])
  )
  if (next.displayType === '9') {
    checkedFieldsMapArr = (
      next.treeCheckedList?.length
        ? next.treeCheckedList.filter((_, index) => index < next.treeFieldList.length)
        : next.treeFieldList.map(() => {
            return {
              checkedFields: [...next.checkedFields],
              checkedFieldsMap: cloneDeep(next.checkedFieldsMap)
            }
          })
    )
      .map(item =>
        Object.entries(item.checkedFieldsMap).filter(ele => item.checkedFields.includes(ele[0]))
      )
      .flat()
  }
  return checkedFieldsMapArr.filter(ele => !!ele[1]).map(ele => ele[0])
}