import { Interval } from 'date-fns'
import { useContext } from 'react'

import { Dsp } from '../Consts'
import { DateData } from '../DateData'
import { useGet } from '../components/Network'
import { ArtistContext } from '../contexts/ArtistContext'
import { UserContext } from '../contexts/UserContext'
import { intervalDates, toQueryString } from '../util'
import { useCacheKey } from './useCacheKey'
import { NetworkError, useNetwork } from './useNetwork'

interface TrackCountryStreamsResponse {
  streams: DateData<number | null>[]
}

export function useTrackCountryStreams(
  isrc: string,
  interval: Interval,
  countryCode: string,
  dsp: Dsp | 'all'
): {
  streams?: DateData<number | null>[]
  startDate: string
  endDate: string
  error: NetworkError | null
} {
  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/${countryCode}/streams?${query}`
  const response = useNetwork<TrackCountryStreamsResponse>(useGet(path, user))

  useCacheKey(path)

  return {
    streams: response?.data?.streams,
    startDate,
    endDate,
    error: response?.error,
  }
}
