import { useState, useEffect, useMemo } from 'react';
import debounce from '../blue_modules/debounce';

// Overload signatures
function useDebounce<T extends (...args: any[]) => any>(callback: T, delay: number): T;
function useDebounce<T>(value: T, delay: number): T;

function useDebounce<T>(value: T, delay: number): T {
  const isFn = typeof value === 'function';

  const debouncedFunction = useMemo(() => {
    return isFn ? debounce(value as unknown as (...args: any[]) => any, delay) : null;
  }, [isFn, value, delay]);

  const [debouncedValue, setDebouncedValue] = useState<T>(value);

  useEffect(() => {
    if (!isFn) {
      const handler = setTimeout(() => setDebouncedValue(value), delay);
      return () => clearTimeout(handler);
    }
  }, [isFn, value, delay]);

  return isFn ? (debouncedFunction as unknown as T) : debouncedValue;
}

export default useDebounce;