import { Interval } from 'date-fns'
import { useContext } from 'react'
import { NetworkRequest, useNetwork } from '../components/useNetwork'
import { Dsp } from '../Consts'
import { ArtistContext } from '../contexts/ArtistContext'
import { UserContext } from '../contexts/UserContext'
import { CountryWithStreamsByDsp } from '../types/Country'
import { TimeInterval } from '../types/TimeInterval'
import { intervalDates, timeRangeInterval, toQueryString } from '../util'
import { useCacheKey } from './useCacheKey'

interface TrackTopCountriesResponse {
  countries: CountryWithStreamsByDsp[]
}

export function useTrackTopCountries(
  isrc: string,
  interval: Interval,
  dsp: Dsp | 'all'
): NetworkRequest<TrackTopCountriesResponse> {
  const user = useContext(UserContext)
  const artist = useContext(ArtistContext)
  const { startDate, endDate } = intervalDates(interval)
  const query = toQueryString({
    startDate,
    endDate,
    dsp: dsp === 'all' ? null : dsp,
  })
  const path = `api/artists/${artist.sonyArtistId}/track/${isrc}/countries?${query}`
  const response = useNetwork<TrackTopCountriesResponse>(path, user, () => {})

  useCacheKey(path)

  return response
}

export function useTrackTopCountryCodes(
  isrc: string,
  timeInterval: TimeInterval
): string[] {
  const { data: trackTopCountriesData } = useTrackTopCountries(
    isrc,
    timeRangeInterval(timeInterval),
    'all'
  )
  return (
    trackTopCountriesData?.countries
      ?.find(({ dsp }) => dsp === 'all')
      ?.streams.map(({ item: { countryCode } }) => countryCode) ?? []
  )
}
