
import _ from 'lodash'
const emptyList = [undefined, null]
// 解析url的问号参数
function parseUrlQueryString() {
  const host = decodeURIComponent(location.hash)
  const queryObj = {}
  if (host.includes('?')) {
    const query = host.split('?')[1]
    const queryList = query.split('&')
    queryList.forEach(item => {
      const iObj = item.split('=')
      queryObj[iObj[0]] = iObj[1]
    })
  }
  return queryObj
}
// 获取登录信息
function parseGlobalParams() {
  const globalParam = {}
  let user_info = sessionStorage['user_info']
  if (user_info && user_info !== 'undefined') {
    user_info = JSON.parse(user_info)
  }
  Object.assign(globalParam, user_info)
  return globalParam
}
// 解析queryBi dync页面路由上的appCode 和pageName
function parseUrlQueryBIDyncAppcodePageName() {
  const hash = decodeURIComponent(location.hash)
  const hostSplit = hash.split('?')
  let target = hostSplit[0]
  // 如果说最后一位是‘/’ 则删除掉
  if (target.endsWith('/')) {
    target = target.substr(0, target.length - 1)
  }
  const targetSplit = target.split('/')
  const length = targetSplit.length
  let pagename = targetSplit[length - 1]
  const appCode = targetSplit[length - 2]
  if (pagename.includes('/')) {
    pagename = pagename.split('/')[0]
  }
  if (pagename.includes('?')) {
    pagename = pagename.split('?')[0]
  }
  return {
    appCode: appCode,
    pagename: pagename
  }
}
// 解析动态菜单参数和全局参数MenuParams GlobalParams
function parseMenuGlobalParams(str, params) {
  const { menuParam, globalParam, otherParam } = params
  const empyt = [undefined]
  if (typeof str !== 'string' || !str.includes('{') || !str.includes('}')) return str
  const reg = /\{(.*?)\}/g //  /(?<=\{).*?(?=\})/g
  const strList = str.match(reg) || []// value_.match(/(?<=\{).*?(?=\})/g) || [] // value_.match(reg) || [] //
  strList.forEach(p => {
    const p_ = p.replace('{', '').replace('}', '')
    const props = p_.split('.')
    const sourceStr = props[0]
    const propStr = props[1]
    let pt = ''
    if (sourceStr === 'menuParam') {
      if (empyt.includes(menuParam[propStr])) {
        pt = p
      } else {
        pt = menuParam[propStr]
      }
    } else if (sourceStr === 'globalParam') {
      if (empyt.includes(globalParam[propStr])) {
        pt = p
      } else {
        pt = globalParam[propStr]
      }
    } else {
      if (empyt.includes(otherParam[propStr])) {
        pt = p
      } else {
        pt = otherParam[propStr]
      }
    }
    pt = decodeURIComponent(pt)
    if (pt === 'false' || pt === 'true') {
      str = pt !== 'false'// str.replace(`{${p_}}`, pt)
    } else {
      str = str.replace(`{${p_}}`, pt)
    }
  })
  return str
}
// 递归替换动态参数
function recursiveDyncParam(obj, otherOBj = {}) {
  const parseUrlQueryParams = parseUrlQueryString() || {}
  const parseGlobalParams_ = parseGlobalParams() || {}
  const parms = {
    menuParam: parseUrlQueryParams, globalParam: parseGlobalParams_, otherParam: otherOBj
  }
  const objType = typeof obj
  if (Array.isArray(obj)) {
    obj.forEach((item, index) => {
      if (typeof item === 'object') {
        this.recursiveDyncParam(item, otherOBj)
      } else {
        obj[index] = parseMenuGlobalParams(item, parms)
      }
    })
  } else if (objType === 'object') {
    for (const prop in obj) {
      if (typeof obj[prop] === 'object') {
        this.recursiveDyncParam(obj[prop], otherOBj)
      } else {
        obj[prop] = parseMenuGlobalParams(obj[prop], parms)
      }
    }
  } else {
    return parseMenuGlobalParams(obj, parms)
  }
}
function filterSingleRow(newObj, oldObj, prop = 'id') {
  delete newObj.isSelected
  delete oldObj.isSelected
  const _newObj = _.cloneDeep(newObj)
  const _oldObj = _.cloneDeep(oldObj)
  const result = {}
  for (const p in _newObj) {
    if ((_oldObj[p] !== _newObj[p] && !emptyList.includes(_newObj[p])) || p === prop) {
      result[p] = _newObj[p]
    }
  }
  return result
}
// newData:当前数据.oldData:原始数据,primaryKey;主键id,reservedObj:保留字段
function comparisonArray(newData_, oldData_, primaryKey, reservedArray = []) {
  const newData = _.cloneDeep(newData_)
  const oldData = _.cloneDeep(oldData_)
  const emptyValue = [undefined, 'undefined', '']
  // 1,找出原始数据中所有的id
  const old_ids = oldData.reduce((pre, curr) => {
    const id = curr[primaryKey]
    if (id) {
      pre.push(id)
    }
    return pre
  }, [])
  // 2,找出新数据中所有项的id
  const new_ids = newData.reduce((pre, curr) => {
    const id = curr[primaryKey]
    if (id) {
      pre.push(id)
    }
    return pre
  }, [])

  // 3,找出删除项
  const delete_ids = old_ids.filter(item => {
    if (!new_ids.includes(item)) {
      return item
    }
  })
  const newItems = newData_.filter(item => {
    if (item.iUpdateStatus === 1) {
      return item
    }
  })

  // 找出修改项目
  const edit_item = newData.filter(item => {
    delete item.isSelected
    const id = item[primaryKey]
    const curr_old_item = oldData.find(element => {
      if (element[primaryKey] === id && item.iUpdateStatus !== 1) {
        return element
      }
    })
    if (id && curr_old_item) {
      // 找出变化的字段 并且保留必要字段
      for (const key in curr_old_item) {
        const hasKey = key in item
        if (!hasKey) { // 如果这个字段不在现有行中 则视为删除了
          item[key] = ''
        } else { // 如果字段对应的值相等 则视为 没更改 提交数据时把这个这段排除
          if (curr_old_item[key] === item[key] && key !== primaryKey && !reservedArray.includes(key)) {
            delete item[key]
          }
        }
      }
      const length1 = Object.keys(item).length
      if (length1 > 1) {
        return item
      }
    }
  })
  // 组装数据
  // 为新增项加一个标示
  newItems.forEach((item, index) => {
    delete item.isSelected
    // 删除空值
    for (const key in item) {
      const value = item[key]
      if (emptyValue.includes(value)) {
        delete item[key]
      }
    }
    delete item._columns
  })
  // 筛选出非空项
  const newItems_ = newItems.filter(item => Object.keys(item).length)
  // 为修改项加标示
  edit_item.filter(item => Object.keys(item).length).forEach(item => {
    delete item.isSelected
    for (const k in item) {
      if (item[k] === undefined) {
        item.k = ''
      }
    }
    if (Object.keys(item).length > 1) {
      item.iUpdateStatus = 2
    }
  })
  const delete_items = []
  delete_ids.forEach(item => {
    const parm = {
      iUpdateStatus: 4
    }
    parm[primaryKey] = item
    delete_items.push(parm)
  })
  const result = [...edit_item, ...delete_items, ...newItems_]
  return result
}
function comparisonJson(newData_, oldData_, primaryKey, reservedArray = []) {
  const newData = _.cloneDeep(newData_)
  const oldData = _.cloneDeep(oldData_)
  const emptyValue = [undefined, 'undefined']
  const iUpdateStatus = newData.iUpdateStatus
  if (iUpdateStatus === 1) { // 新增
    for (const key in newData) {
      const value = newData[key]
      if (emptyValue.includes(value)) {
        delete newData[key]
      }
    }
  } else { // 修改
    for (const key in newData) {
      if (key === '') {
        debugger
        delete newData[key]
      }
      if (newData[key] === oldData[key] && key !== primaryKey) {
        delete newData[key]
      }
      newData.iUpdateStatus = 2
    }
  }
  delete newData._columns
  return newData
}
// 递归替换action 函数
function recursiveReplaceAction(obj, activeManager) {
  for (const k in obj) {
    const value = obj[k]
    const type_k = typeof value
    if (type_k === 'string') {
      this.replaceItemAction(obj, activeManager)
    } else if (type_k === 'object') {
      this.recursiveReplaceAction(value, activeManager)
    }
  }
}
function replaceItemAction(item, activeManager) {
  const actionProps = ['isHide', 'click', 'disabled', 'changed', 'cleared']
  actionProps.forEach(k => {
    const type = typeof item[k]
    if (type === 'string' && !item[k].startsWith('$')) {
      const funName = '$' + item[k]
      item[k] = activeManager[funName]
    }
  })
}
export default {
  parseUrlQueryString,
  parseGlobalParams,
  parseUrlQueryBIDyncAppcodePageName,
  parseMenuGlobalParams,
  recursiveDyncParam,
  filterSingleRow,
  comparisonJson,
  comparisonArray,
  _,
  cloneDeep: _.cloneDeep, // 深拷贝
  recursiveReplaceAction,
  replaceItemAction
}
