import { DebounceSettings, DebouncedFunc } from 'lodash-es';
import { Ref } from 'vue';

/**
 * 拖拽选中效果
 */
declare const useDragSelect: () => {};

/**
 * 获取下一个ID
 * @author  Yuluo
 * @link    https://github.com/YuluoY
 * @date    2024-10-05
 * @param   {object}  opts
 * @param   {boolean} [opts.isOrderly=true] 是否有序id
 * @returns {string}
 * @example
 * ```ts
 * useNextId() // '1'
 * useNextId({ isOrderly: false }) // '0x1g4k'
 * ```
 */
declare function useNextId(opts?: {
    isOrderly?: boolean;
}): string;

interface URootFontSizeOptions {
    rootFontSize?: number;
    isResize?: boolean;
    resizeTimeout?: number;
    immediate?: boolean;
    debounceOpt?: DebounceSettings;
    afterRefreshCallback?: (rootFontSize: number | undefined) => void;
    beforeRefreshCallback?: (rootFontSize: number | undefined) => void;
}
interface URootFontSizeReturn {
    rootFontSize?: number;
    destory: () => void;
    refreshRootFontSize: () => void;
    refreshRootFontSizeDebounce?: DebouncedFunc<() => void>;
    setRootFontSize: (rootFontSize: number) => void;
}
/**
 * 处理根字体大小 rem 响应式布局
 * @author  Yuluo
 * @link    https://github.com/YuluoY
 * @date    2024-08-24
 * @param   {URootFontSizeOptions}  options                           配置项
 * @param   {number}                [options.rootFontSize]            根字体大小
 * @param   {number}                [options.resizeTimeout]           resize事件防抖时间, 默认300ms
 * @param   {boolean}               [options.isResize]                是否开启resize事件, 默认true
 * @param   {boolean}               [options.immediate]               是否立即执行, 默认false
 * @param   {DebounceSettings}      [options.debounceOpt]             lodash防抖配置, 默认{}
 * @returns {URootFontSizeReturn}
 * @example
 * ```js
 * const {
 *  destory,                      // 销毁resize事件
 *  rootFontSize,                 // 根字体大小
 *  refreshRootFontSize,          // 刷新根字体大小函数
 *  refreshRootFontSizeDebounce,  // lodash的防抖函数
 * } = useRootFontSize({
 *    setRootFontSizeCallback: (rootFontSize) => {
 *      console.log(rootFontSize)
 *    },
 *    immediate: true,
 *    isResize: true,
 *    resizeTimeout: 300,
 *    debounceOpt: {
 *      // lodash防抖配置
 *    }
 * })
 * ```
 */
declare function useRootFontSize(options: URootFontSizeOptions): URootFontSizeReturn;

interface EventOptions extends AddEventListenerOptions {
    debounce?: number;
    throttle?: number;
    immediate?: boolean;
}
type TargetType = EventTarget | (() => EventTarget) | Ref<EventTarget>;
type CleanupFn = () => void;
/**
 * 使用addEventListener监听事件，仅在vue3中使用
 * @author  Yuluo
 * @link    https://github.com/YuluoY
 * @date    2025-02-11
 * @param target    监听目标（DOM元素或返回DOM元素的函数）
 * @param event     事件名称
 * @param callback  事件处理函数
 * @param options   配置选项（包括防抖、节流等）
 * @returns         清理函数，用于手动移除事件监听
 * @example
 * ```ts
 * const cleanup = useEventListener(document.querySelector('#app'), 'click', () => {
 *   console.log('clicked')
 * })

 * // 使用ref
 * const ref = ref(document.querySelector('#app'))
 * const cleanup = useEventListener(ref, 'click', () => {
 *   console.log('clicked')
 * })
 *
 * // 使用函数
 * const cleanup = useEventListener(() => document.querySelector('#app'), 'click', () => {
 *   console.log('clicked')
 * })
 *
 *  * // 在需要时手动清理
 * cleanup()
 *
 * ```
 */
declare function useEventListener(target: TargetType, event: keyof WindowEventMap, callback: EventListener, options?: EventOptions): CleanupFn;

declare const _default: {
    useDragSelect: () => {};
    useRootFontSize: typeof useRootFontSize;
    useNextId: typeof useNextId;
    useEventListener: typeof useEventListener;
};

declare const hooks_useDragSelect: typeof useDragSelect;
declare const hooks_useEventListener: typeof useEventListener;
declare const hooks_useNextId: typeof useNextId;
declare const hooks_useRootFontSize: typeof useRootFontSize;
declare namespace hooks {
  export { _default as default, hooks_useDragSelect as useDragSelect, hooks_useEventListener as useEventListener, hooks_useNextId as useNextId, hooks_useRootFontSize as useRootFontSize };
}

export { _default as _, useRootFontSize as a, useNextId as b, useEventListener as c, hooks as h, useDragSelect as u };
