import React from 'react'
import { RefreshControlProps, SectionList } from 'react-native'

import { Product } from '../types/Product'
import { productItemFieldsFromProduct } from '../types/graphqlCompatibilityHelpers'
import { TrackListSkeleton } from './Skeleton'
import { ProductListItemProps } from './listitems/ProductListItem'

export interface ProductCategory {
  title: React.ReactElement
  data: Product[]
}

export type ProductSortFn = (a: Product, b: Product) => number

export const ProductListContainer: React.FC<{
  productsByCategory?: ProductCategory[]
  refreshControl: React.ReactElement<RefreshControlProps>
  onPressProduct: (product: Product) => void
  displayRank?: boolean
  sortFn: ProductSortFn
  ListItem: React.FC<ProductListItemProps>
}> = ({
  productsByCategory,
  refreshControl,
  onPressProduct,
  displayRank = false,
  sortFn,
  ListItem,
}) =>
  productsByCategory ? (
    <SectionList
      keyExtractor={(product) => product.productId}
      refreshControl={refreshControl}
      renderItem={({ item, index }) => (
        <ListItem
          index={displayRank === false ? undefined : index}
          key={item.productId}
          product={productItemFieldsFromProduct(item)}
          onPress={() => onPressProduct(item)}
        />
      )}
      renderSectionHeader={({ section: { title } }) => title}
      sections={productsByCategory.map((category: ProductCategory) => {
        category.data = category.data.sort(sortFn)
        return category
      })}
      stickySectionHeadersEnabled={false}
    />
  ) : (
    <TrackListSkeleton numItems={4} dspFilter />
  )

export function sortProductByName(a: Product, b: Product): number {
  return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase())
}

export function sortProductByReleaseDate(a: Product, b: Product): number {
  if (a.releaseDate != null && b.releaseDate != null) {
    return new Date(b.releaseDate).getTime() - new Date(a.releaseDate).getTime()
  }

  if (a.releaseDate == null && b.releaseDate == null) {
    return 0
  }

  if (a.releaseDate == null) {
    return 1
  }

  return -1
}
