import React from 'react'
import { StyleProp, ViewStyle } from 'react-native'

import {
  TrackPlaylistCurrentFieldsFragment,
  TrackPlaylistFieldsFragment,
  TrackPlaylistPreviousFieldsFragment,
} from '../graphql/__generated__/sdk'
import { Strings } from '../i18n'
import { formatDateDistanceToNow, formatDistance } from '../util'
import { PlaylistImage } from './PlaylistImage'
import { EntityPositionListItem } from './listitems/EntityPositionListItem'

const imageSize = 48

export const TrackPlaylistCurrent: React.FC<{
  playlist: TrackPlaylistCurrentFieldsFragment
  positionDate?: string | undefined
  showDetails: boolean
  extra: React.ReactElement
  pressDisabled?: boolean
  style?: StyleProp<ViewStyle>
  onPress?: (playlist: TrackPlaylistFieldsFragment) => void
}> = ({
  playlist,
  positionDate,
  pressDisabled,
  extra,
  style,
  showDetails,
  onPress,
}) => (
  <EntityPositionListItem
    image={
      <PlaylistImage playlist={playlist?.playlist} imageSize={imageSize} />
    }
    name={playlist.playlist.name}
    topRightText={positionDate && formatDateDistanceToNow(positionDate)}
    onPress={() => onPress?.(playlist)}
    pressDisabled={pressDisabled}
    isNew={playlist.numWeeksOn === 0 && showDetails}
    streams={playlist.streamsLast7Days ?? undefined}
    extra={extra}
    style={style}
  />
)

export const TrackPlaylistPast: React.FC<{
  playlist: TrackPlaylistPreviousFieldsFragment
  earliestPositionDate?: string
  lastPositionDate?: string
  numDaysOn?: number
  extra: React.ReactElement
  pressDisabled?: boolean
  style?: StyleProp<ViewStyle>
  onPress?: (playlist: TrackPlaylistFieldsFragment) => void
}> = ({
  playlist,
  earliestPositionDate,
  lastPositionDate,
  numDaysOn,
  pressDisabled,
  extra,
  style,
  onPress,
}) => (
  <EntityPositionListItem
    image={
      <PlaylistImage playlist={playlist?.playlist} imageSize={imageSize} />
    }
    name={playlist.playlist.name}
    topRightText={
      earliestPositionDate != null &&
      lastPositionDate != null &&
      earliestPositionDate !== lastPositionDate
        ? Strings.Shared.OnForTimeInterval.replace(
            '%s',
            formatDistance(earliestPositionDate, lastPositionDate)
          )
        : ''
    }
    onPress={() => onPress?.(playlist)}
    pressDisabled={pressDisabled}
    isNew={false}
    extra={extra}
    style={style}
  />
)
