import { MutationTree, ActionTree } from 'vuex'
import { RootState } from '@/store/index'
import { search } from '@/api/search'
import {
  SearchMutations,
  SearchActions,
  SearchState,
  SearchType,
  Pagination
} from '@/interface'
import { clone } from 'lodash-es'

const calcSlice = (pagination: Pagination, page: number) => {
  const p = clone(pagination)
  p.offset = page
  const { limit, offset, total } = p
  const totalCalc = limit * offset
  if (total && totalCalc > total) {
    p.slice = totalCalc - total
  } else {
    p.slice = 0
  }
  return p.slice
}

export const actions: ActionTree<SearchState, RootState> = {
  async [SearchActions.GET_SONG_LIST]({ state, commit }, payload) {
    state.songList.loading = true
    const { slice, limit, offset } = state.songList.pagination
    const result = await search(
      payload,
      SearchType.SONG,
      state.songList.pagination
    )
    state.songList.loading = false
    state.songList.data = result.songs.slice(slice).map(song => {
      return {
        ...song,
        dt: song.duration,
        al: song.album,
        ar: song.artists,
        index: (offset - 1) * limit
      }
    })
    state.songList.total = result.songCount
    commit(
      SearchMutations.SET_SEARCH_TITLE,
      `找到 ${state.songList.total} 首歌曲`
    )
  },
  async [SearchActions.GET_ARTIST_LIST]({ state, commit }, payload) {
    state.artistList.loading = true
    const { slice, limit, offset } = state.artistList.pagination
    const result = await search(
      payload,
      SearchType.ARTIST,
      state.artistList.pagination
    )
    state.artistList.loading = false
    state.artistList.data = result.artists.slice(slice).map(artist => {
      return {
        ...artist,
        picUrl: artist.picUrl || artist.img1v1Url,
        index: (offset - 1) * limit
      }
    })
    state.artistList.total = result.artistCount
    commit(
      SearchMutations.SET_SEARCH_TITLE,
      `找到 ${state.artistList.total} 位歌手`
    )
  },
  async [SearchActions.GET_PLAYLIST_LIST]({ state, commit }, payload) {
    state.playlist.loading = true
    const { slice, limit, offset } = state.playlist.pagination
    const result = await search(
      payload,
      SearchType.PLAY_LIST,
      state.playlist.pagination
    )
    state.playlist.loading = false
    state.playlist.data = result.playlists.slice(slice).map(playlist => {
      return {
        ...playlist,
        picUrl: playlist.coverImgUrl,
        count: playlist.trackCount,
        index: (offset - 1) * limit
      }
    })
    state.playlist.total = result.playlistCount
    commit(
      SearchMutations.SET_SEARCH_TITLE,
      `找到 ${state.playlist.total} 个歌单`
    )
  },
  async [SearchActions.GET_ALBUM_LIST]({ state, commit }, payload) {
    state.albumList.loading = true
    const { slice, limit, offset } = state.albumList.pagination
    const result = await search(
      payload,
      SearchType.ALBUM,
      state.albumList.pagination
    )
    state.albumList.loading = false
    state.albumList.data = result.albums.slice(slice).map(album => {
      return {
        ...album,
        picUrl: album.picUrl || album.blurPicUrl,
        count: album.size,
        index: (offset - 1) * limit
      }
    })
    state.albumList.total = result.albumCount
    commit(
      SearchMutations.SET_SEARCH_TITLE,
      `找到 ${state.albumList.total} 张专辑`
    )
  },
  async [SearchActions.GET_LYRICS_LIST]({ state, commit }, payload) {
    state.lyriceList.loading = true
    const { slice, limit, offset } = state.lyriceList.pagination
    const result = await search(
      payload,
      SearchType.LYRICS,
      state.lyriceList.pagination
    )
    state.lyriceList.loading = false
    state.lyriceList.data = result.songs.slice(slice).map(lyrics => {
      return {
        ...lyrics,
        dt: lyrics.duration,
        al: lyrics.album,
        ar: lyrics.artists,
        index: (offset - 1) * limit
      }
    })
    state.lyriceList.total = result.songCount
    commit(
      SearchMutations.SET_SEARCH_TITLE,
      `找到 ${state.lyriceList.total} 首歌词`
    )
  }
}

export const mutations: MutationTree<SearchState> = {
  [SearchMutations.SET_SEARCH_TITLE](state, txt) {
    state.searchTitle = txt
    console.log(txt)
  },
  [SearchMutations.CHANGE_SONG_PAGE_OFFSET](state, page) {
    state.songList.pagination.offset = page
    state.songList.pagination.slice = calcSlice(state.songList.pagination, page)
  },
  [SearchMutations.CHANGE_ARTIST_PAGE_OFFSET](state, page) {
    state.artistList.pagination.offset = page
    state.artistList.pagination.slice = calcSlice(
      state.artistList.pagination,
      page
    )
  },
  [SearchMutations.CHANGE_PLAYLIST_PAGE_OFFSET](state, page) {
    state.playlist.pagination.offset = page
    state.playlist.pagination.slice = calcSlice(state.playlist.pagination, page)
  },
  [SearchMutations.CHANGE_ALBUM_PAGE_OFFSET](state, page) {
    state.albumList.pagination.offset = page
    state.albumList.pagination.slice = calcSlice(
      state.albumList.pagination,
      page
    )
  },
  [SearchMutations.CHANGE_LYRICS_PAGE_OFFSET](state, page) {
    state.lyriceList.pagination.offset = page
    state.lyriceList.pagination.slice = calcSlice(
      state.lyriceList.pagination,
      page
    )
  }
}