import { useCallback, useRef } from "react";
import * as R from "ramda";
import {
  MAX_SEEK_TIME,
  ON_PRESS_RESET_DURATION,
  SEEK_TYPE,
  SKIP_TIME_BASE,
} from "./const";
import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";

type SeekType = SEEK_TYPE | null;

const getSkipTime = (multiplier) => {
  const skipTime = R.min(MAX_SEEK_TIME, SKIP_TIME_BASE * multiplier);

  return skipTime;
};

export const useTapSeek = () => {
  const onPressMultiplier = useRef(1);
  const lastPressTime = useRef(0);
  const currentOnPressEventType = useRef<SeekType>(null);

  const resetMultiplier = useCallback(() => {
    onPressMultiplier.current = 1;
  }, []);

  const handlePressEvent = useCallback(
    (eventType) => {
      const player = playerManager.getInstanceController();
      if (!player) return;

      const now = Date.now();
      const timeSinceLastPress = now - lastPressTime.current;
      const isSameEventType = eventType === currentOnPressEventType.current;

      const isWithinResetDuration =
        timeSinceLastPress <= ON_PRESS_RESET_DURATION;

      const shouldIncreaseMultiplier = isSameEventType && isWithinResetDuration;

      if (shouldIncreaseMultiplier) {
        onPressMultiplier.current += 1;
      } else {
        resetMultiplier();
      }

      const seekTime = getSkipTime(onPressMultiplier.current);
      player[eventType](seekTime);

      lastPressTime.current = now;
      currentOnPressEventType.current = eventType;
    },
    [resetMultiplier]
  );

  return handlePressEvent;
};
