text: let allList = {}
  window.allList = allList
  
  const allListInit = (defaultList, loveList, userList) => {
    allList[defaultList.id] = defaultList
    allList[loveList.id] = loveList
    for (const list of userList) allList[list.id] = list
  }
  const allListUpdate = list => {
    allList[list.id] = list
  }
  const allListRemove = list => {
    delete allList[list.id]
  }
  
  // state
  const state = {
    isInitedList: false,
    defaultList: {
      id: 'default',
      name: '试听列表',
      list: [],
      location: 0,
    },
    loveList: {
      id: 'love',
      name: '我的收藏',
      list: [],
      location: 0,
    },
    tempList: {
      id: 'temp',
      name: '临时列表',
      list: [],
      location: 0,
    },
    userList: [],
  }
  
  // getters
  const getters = {
    isInitedList: state => state.isInitedList,
    defaultList: state => state.defaultList || {},
    loveList: state => state.loveList || {},
    userList: state => state.userList,
    allList: () => allList,
  }
  
  // actions
  const actions = {
  
  }
  
  // mitations
  const mutations = {
    initList(state, { defaultList, loveList, userList }) {
      if (defaultList != null) Object.assign(state.defaultList, { list: defaultList.list, location: defaultList.location })
      if (loveList != null) Object.assign(state.loveList, { list: loveList.list, location: loveList.location })
      if (userList != null) state.userList = userList
      allListInit(state.defaultList, state.loveList, state.userList)
      state.isInitedList = true
    },
    setList(state, { id, list, name, location }) {
      const targetList = allList[id]
      if (targetList) {
        if (name && targetList.name === name) {
          targetList.list.splice(0, targetList.list.length, ...list)
          targetList.location = location
          return
        }
  
        id += '_' + Math.random()
      }
      let newList = {
        name,
        id,
        list,
        location,
      }
      state.userList.push(newList)
      allListUpdate(newList)
    },
    listAdd(state, { id, musicInfo }) {
      const targetList = allList[id]
      if (!targetList) return
      if (targetList.list.some(s => s.songmid === musicInfo.songmid)) return
      targetList.list.push(musicInfo)
    },
    listMove(state, { fromId, musicInfo, toId }) {
      const fromList = allList[fromId]
      const toList = allList[toId]
      if (!fromList || !toList) return
      fromList.list.splice(fromList.list.indexOf(musicInfo), 1)
      let index = toList.list.findIndex(s => s.songmid === musicInfo.songmid)
      if (index > -1) return toList.list.splice(index, 1)
      toList.list.push(musicInfo)
    },
    listAddMultiple(state, { id, list }) {
      let targetList = allList[id]
      if (!targetList) return
      let newList = [...targetList.list, ...list]
      let map = {}
      let ids = []
      for (const item of newList) {
        if (map[item.songmid]) continue
        ids.push(item.songmid)
        map[item.songmid] = item
      }
      targetList.list.splice(0, targetList.list.length, ...ids.map(id => map[id]))
    },
    // { fromId, toId, list }
    listMoveMultiple(state, { fromId, toId, list }) {
      console.log(state.commit)
      this.commit('list/listRemoveMultiple', { id: fromId, list })
      this.commit('list/listAddMultiple', { id: toId, list })
    },
    listRemove(state, { id, index }) {
      let targetList = allList[id]
      if (!targetList) return
      targetList.list.splice(index, 1)
    },
    listRemoveMultiple(state, { id, list }) {
      let targetList = allList[id]
      if (!targetList) return
      let map = {}
      let ids = []
      for (const item of targetList.list) {
        ids.push(item.songmid)
        map[item.songmid] = item
      }
      for (const item of list) {
        if (map[item.songmid]) delete map[item.songmid]
      }
      let newList = []
      for (const id of ids) if (map[id]) newList.push(map[id])
  
      targetList.list.splice(0, targetList.list.length, ...newList)
    },
    listClear(state, id) {
      let targetList = allList[id]
      if (!targetList) return
      targetList.list.splice(0, targetList.list.length)
    },
    updateMusicInfo(state, { id, index, data }) {
      let targetList = allList[id]
      if (!targetList) return
      Object.assign(targetList.list[index], data)
    },
    createUserList(state, { name, id = `userlist_${Date.now()}`, list = [] }) {
      let newList = state.userList.find(item => item.id === id)
      if (!newList) {
        newList = {
          name,
          id,
          list: [],
          location: 0,
        }
        state.userList.push(newList)
        allListUpdate(newList)
      }
      this.commit('list/listAddMultiple', { id, list })
    },
    removeUserList(state, index) {
      let list = state.userList.splice(index, 1)[0]
      allListRemove(list)
    },
    setUserListName(state, { index, name }) {
      let list = state.userList[index]
      if (!list) return
      list.name = name
    },
    moveupUserList(state, index) {
      let targetList = state.userList[index]
      state.userList.splice(index, 1)
      state.userList.splice(index - 1, 0, targetList)
    },
    movedownUserList(state, index) {
      let targetList = state.userList[index]
      state.userList.splice(index, 1)
      state.userList.splice(index + 1, 0, targetList)
    },
    setListScroll(state, { id, location }) {
      if (allList[id]) allList[id].location = location
    },
  }
  
  export default {
    namespaced: true,
    state,
    getters,
    actions,
    mutations,
  }
  