import { useContext } from 'react'
import { useNetwork } from '../components/useNetwork'
import { ArtistContext } from '../contexts/ArtistContext'
import { UserContext } from '../contexts/UserContext'
import { Product } from '../types/Product'
import { TrackWithStreamsByDspAndDate } from '../types/types'
import { intervalDates } from '../util'

export interface ProductListResponse {
  products: Product[]
}

export function useProducts(onRefresh: () => void) {
  const artist = useContext(ArtistContext)
  const user = useContext(UserContext)

  const { data, showToast, refreshControl, error } =
    useNetwork<ProductListResponse>(
      `api/artists/${artist.sonyArtistId}/products`,
      user,
      onRefresh
    )

  const albums = data?.products
    ? data.products.filter(
        ({ productVersion }) =>
          productVersion.configCatKey === 'C' && // Only display products of category C
          productVersion.isProductFamilyHead && // Filter out multiple variants of the same album that are not the product family head
          productVersion.mainArtistId === artist.sonyArtistId // Filter out collections that contain various artists
      )
    : null

  return { data, albums, showToast, refreshControl, error }
}

export interface ProductResponse {
  product: Product
  streams: TrackWithStreamsByDspAndDate[]
}

export function useProduct(
  productId: string,
  interval: Interval,
  onRefresh: () => void
) {
  const user = useContext(UserContext)
  const artist = useContext(ArtistContext)
  const { startDate, endDate } = intervalDates(interval)

  return useNetwork<ProductResponse>(
    `api/artists/${artist.sonyArtistId}/products/${productId}` +
      `?startDate=${startDate}&endDate=${endDate}`,
    user,
    onRefresh
  )
}
