import _ from 'lodash'
import { useContext } from 'react'

import { PlaylistDsp } from '../Consts'
import { ArtistContext } from '../contexts/ArtistContext'
import { GraphQLContext } from '../contexts/GraphQLContext'
import { UserContext } from '../contexts/UserContext'
import {
  DspId,
  GetArtistTrackCurrentPlaylistsQuery,
  PlaylistType,
  TrackCurrentPlaylistsOrder,
} from '../graphql/__generated__/sdk'
import { intervalDates } from '../util'
import { useNetwork } from './useNetwork'

export function useTrackPlaylistsData(
  isrc: string,
  interval: Interval,
  dsp: PlaylistDsp,
  market: string,
  playlistTypes: PlaylistType[],
  orderBy: TrackCurrentPlaylistsOrder[],
  pagination?: { first?: number }
) {
  const g = useContext(GraphQLContext)
  const user = useContext(UserContext)
  const artist = useContext(ArtistContext)
  const { startDate, endDate } = intervalDates(interval)
  const orderByQuery = JSON.stringify(orderBy)
  const paginationQuery = JSON.stringify(pagination)
  const search = new URLSearchParams(
    _.pickBy({
      startDate,
      endDate,
      dsp,
      market,
      playlistTypes,
      orderByQuery,
      paginationQuery,
    }) as _.Dictionary<string>
  ).toString()
  const cacheKey = `api/artists/${artist.sonyArtistId}/track/${isrc}/playlists?${search}`

  // For spotify, we display playlists from the special "worldwide" owner market. For other DSPs we display playlists from any owner market
  // https://data-analytics.atlassian.net/wiki/spaces/AMA/pages/2402746369/Track+Playlists+Screen
  const queryMarket =
    market === 'worldwide' ? (dsp === 'spotify' ? 'worldwide' : null) : market

  const variables = {
    artistId: artist.sonyArtistId,
    isrc,
    market: queryMarket,
    dsp: { apple: DspId.Apple, spotify: DspId.Spotify, amazon: DspId.Amazon }[
      dsp
    ],
    playlistTypes,
    orderBy,
    first: pagination?.first ?? null,
  }

  const response = useNetwork<GetArtistTrackCurrentPlaylistsQuery>(
    g.useGetArtistTrackCurrentPlaylists(
      [cacheKey, user.accessToken],
      variables,
      {
        shouldRetryOnError: false,
      }
    )
  )

  return {
    ...response,
    startDate,
    endDate,
  }
}
