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

import { Dsp } from '../Consts'
import { DateData } from '../DateData'
import { ArtistContext } from '../contexts/ArtistContext'
import { GraphQLContext } from '../contexts/GraphQLContext'
import { TrackDspId } from '../graphql/__generated__/sdk'
import { intervalDates } from '../util'
import { intervalToStrings } from '../util/date'
import { NetworkError, useNetwork } from './useNetwork'

interface ArtistTrackStreamsResponse {
  streams?: DateData<number | null>[]
  startDate: string
  endDate: string
  error: NetworkError | null
}

export function useArtistStreams(
  interval: Interval,
  dsp: Dsp | 'all',
  market: string
): ArtistTrackStreamsResponse {
  const g = useContext(GraphQLContext)
  const artist = useContext(ArtistContext)

  const { startDate, endDate } = intervalDates(interval)

  const variables = {
    artistId: artist.sonyArtistId,
    intervalMetricQueries: [
      {
        interval: intervalToStrings(interval),
        dspId: dsp === 'all' ? null : (dsp as TrackDspId),
        market: market ?? null,
      },
    ],
  }

  const cacheKey = `artistStreams/${artist.sonyArtistId}/${dsp}/${interval.start}/${interval.end}/${market}`

  const response = g.useGetArtistTracksStreams(cacheKey, variables, {
    shouldRetryOnError: false,
  })

  return {
    streams: response?.data?.artist?.trackMetrics[0].map(
      ({ date, streams }) => ({ date, data: streams })
    ),
    startDate,
    endDate,
    error: useNetwork(response).error,
  }
}
