import * as Haptics from 'expo-haptics'
import { useState } from 'react'
import { GestureResponderEvent, ViewProps } from 'react-native'

export function useAnimatedChart(
  domainSize: number,
  width: number,
  scrolling: boolean
): {
  selection?: number
  viewProps: ViewProps
} {
  const [selection, setSelection] = useState<number>()

  const [shortPress, setShortPress] = useState<NodeJS.Timeout>()
  const [longPress, setLongPress] = useState<NodeJS.Timeout>()
  const [longRelease, setLongRelease] = useState<NodeJS.Timeout>()

  const selectionWidth = width / domainSize

  const onResponderGrant = (e: GestureResponderEvent) => {
    const currentOffset = e.nativeEvent.pageX - selectionWidth
    const index = Math.floor((currentOffset / width) * domainSize)

    longPress != null && clearTimeout(longPress)
    longRelease != null && clearTimeout(longRelease)
    shortPress != null && clearTimeout(shortPress)

    if (scrolling) return

    setLongPress(
      setTimeout(() => {
        Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium)
      }, 500)
    )

    setShortPress(setTimeout((): void => setSelection(index), 100))
  }

  const onResponderMove = (e: GestureResponderEvent) => {
    if (scrolling) {
      shortPress != null && clearTimeout(shortPress)
      longPress != null && clearTimeout(longPress)
      longRelease != null && clearTimeout(longRelease)
      return
    }
    const currentOffset = e.nativeEvent.pageX

    const index = Math.floor((currentOffset / width) * domainSize)

    if (selection) setSelection(index)
  }

  const onResponderRelease = () => {
    longPress != null && clearTimeout(longPress)
    setLongPress(undefined)

    longRelease != null && clearTimeout(longRelease)
    setLongRelease(undefined)
    setLongRelease(setTimeout((): void => setSelection(undefined), 500))
  }

  const viewProps = {
    onStartShouldSetResponder: () => true,
    onStartShouldSetResponderCapture: () => true,
    onResponderTerminationRequest: () => false,
    onResponderGrant,
    onResponderMove,
    onResponderRelease,
  }

  return { selection, viewProps }
}
