import { useMemo } from "react";
import RNHapticFeedback from "../hapticFeedback";
import { playHaptic as playHapticUtil } from "../utils/playHaptic";
import type { HapticOptions, HapticEvent, HapticFeedbackTypes } from "../types";

/**
 * React hook that provides haptic feedback methods with optional default options.
 * Returns a stable object — methods only change when the option values change.
 *
 * @example
 * const haptics = useHaptics({ enableVibrateFallback: true });
 * haptics.trigger('impactMedium');
 */
export function useHaptics(defaultOptions?: HapticOptions) {
  const enableVibrateFallback = defaultOptions?.enableVibrateFallback;
  const ignoreAndroidSystemSettings =
    defaultOptions?.ignoreAndroidSystemSettings;

  return useMemo(
    () => ({
      trigger(
        type: keyof typeof HapticFeedbackTypes | HapticFeedbackTypes,
        opts?: HapticOptions,
      ): void {
        RNHapticFeedback.trigger(type, { ...defaultOptions, ...opts });
      },

      triggerPattern(events: HapticEvent[], opts?: HapticOptions): void {
        RNHapticFeedback.triggerPattern(events, { ...defaultOptions, ...opts });
      },

      stop(): void {
        RNHapticFeedback.stop();
      },

      isSupported(): boolean {
        return RNHapticFeedback.isSupported();
      },

      playHaptic(
        ahapFile: string,
        fallback: HapticEvent[],
        opts?: HapticOptions,
      ): Promise<void> {
        return playHapticUtil(ahapFile, fallback, {
          ...defaultOptions,
          ...opts,
        });
      },

      impact(
        type?: keyof typeof HapticFeedbackTypes | HapticFeedbackTypes,
        intensity?: number,
        opts?: HapticOptions,
      ): void {
        RNHapticFeedback.impact(type, intensity, {
          ...defaultOptions,
          ...opts,
        });
      },

      setEnabled: RNHapticFeedback.setEnabled,
      isEnabled: RNHapticFeedback.isEnabled,
      getSystemHapticStatus: RNHapticFeedback.getSystemHapticStatus,
      /** @platform ios */
      playAHAP: RNHapticFeedback.playAHAP,
    }),
    [enableVibrateFallback, ignoreAndroidSystemSettings],
  );
}
