import { Reducer, useEffect, useReducer } from 'react'
import { Alert, AsyncStorage } from 'react-native'
import * as Updates from 'expo-updates'
import * as SecureStore from '../secure-store'
import { useUser } from '../user'

type CounterAction = 'increment' | 'reset'

export default function useEraseLocalData(): { incrementCounter: () => void } {
  const [counter, dispatchCounterAction] = useReducer<
    Reducer<number, CounterAction>
  >((counter: number, action: CounterAction) => {
    switch (action) {
      case 'increment':
        return counter + 1
      case 'reset':
        return 0
    }
  }, 0)

  const incrementCounter = () => dispatchCounterAction('increment')
  const { setUpdateSeenVersion } = useUser()

  useEffect(() => {
    if (counter > 20) {
      Alert.alert(
        'Erase?',
        'Erase all local user data?',
        [
          {
            text: 'Cancel',
            style: 'cancel',
          },
          {
            text: 'Erase',
            onPress: async () => {
              try {
                await Promise.all([AsyncStorage.clear(), SecureStore.clear()])
                Alert.alert('Erased!', 'Local user data erased')
                Updates.reloadAsync()
              } catch (e) {
                Alert.alert(
                  'Error',
                  'Error erasing user data, probably already empty'
                )
                return
              }
            },
          },
          {
            text: `Reset "What's new" popup`,
            onPress: async () => {
              try {
                await setUpdateSeenVersion(null)
                Alert.alert('Reset!', `Reset "What's new" popup`)
                Updates.reloadAsync()
              } catch (e) {
                Alert.alert('Error', "Error resetting What's new version")
                return
              }
            },
          },
        ],
        { cancelable: false }
      )
      dispatchCounterAction('reset')
    }
  }, [counter])

  return { incrementCounter }
}
