import * as vue from 'vue';
import { Ref } from 'vue';
export { useRequest, useRequestProvider } from 'vue-request';

declare type Value = string | number | Date;
interface Options {
    format?: string;
    method?: 'format' | 'millisecond' | 'second' | 'minute' | 'hour' | 'date' | 'day' | 'month' | 'year';
    methodParam?: number;
}
declare function useDate(value?: Value | undefined, options?: Options): {
    readonly data: any;
    refresh: (refreshValue?: Value) => void;
};

/**
 * 处理防抖值
 * @param value
 * @param delay
 * @returns
 */
declare const useDebounce: <T>(value: Ref<T>, delay?: number | undefined) => Ref<T>;

declare type Fn = (...[]: any[]) => any;

/**
 * 处理防抖函数
 * @param fn
 * @param delay
 * @returns
 */
declare const useDebounceFn: (fn: Fn, delay?: number | undefined) => {
    run: () => void;
};

/**
 * 处理防抖值
 * @param value
 * @param delay
 * @returns
 */
declare const useThrottle: <T>(value: Ref<T>, delay?: number | undefined) => Ref<T>;

/**
 * 处理节流函数
 * @param fn
 * @param delay
 * @returns
 */
declare const useThrottleFn: (fn: Fn, delay?: number | undefined) => {
    run: () => void;
};

interface Actions {
    toggle: () => void;
    setTrue: () => void;
    setFalse: () => void;
}
declare function useBoolean(value?: boolean): [Ref<boolean>, Actions];

declare function useModalFn(): {
    editId: vue.Ref<any>;
    visible: vue.Ref<boolean>;
    openModal: (id: any) => void;
    closeModal: () => void;
    onCancel: (fn: Function) => Promise<void>;
    onOk: (fn: Function) => Promise<void>;
};

interface OptionsType extends PageType {
    listKey?: string;
    pageSizeKey?: string;
    pageNumSendKey?: string;
    totalKey?: string;
    requestList: Function;
    defaultParams?: object;
    doFirstLoad?: boolean;
}
interface PageType {
    pageNum: number;
    pageSize: number;
}
declare const usePagination: (options: OptionsType) => {
    pageNum: vue.Ref<number>;
    pageSize: vue.Ref<number>;
    total: vue.Ref<number>;
    onCurrentChange: (page: number) => void;
    onSizeChange: (size: number) => void;
    fetchData: () => void;
    pageDatas: vue.Ref<{
        loading: boolean;
        data: any;
    }>;
};

interface UseFormTableOptionsType extends OptionsType {
    formRef: Ref;
}
declare function useFormTable(options: UseFormTableOptionsType): {
    pageNum: Ref<number>;
    pageSize: Ref<number>;
    total: Ref<number>;
    reset: () => void;
    onCurrentChange: (page: number) => void;
    onSizeChange: (size: number) => void;
    fetchData: () => void;
    pageDatas: Ref<{
        loading: boolean;
        data: any;
    }>;
};

export { useBoolean, useDate, useDebounce, useDebounceFn, useFormTable, useModalFn, usePagination, useThrottle, useThrottleFn };
