/**
 * 路由后置钩子函数
 * @param to 已经进入的路由
 * @param from 上一个路由
 */
declare type AfterEachHook = (to: Route, from: Route | null) => void;

/**
 * 构建完整的 URL 字符串，根据传入的路径和查询参数生成最终的 URL
 * @param path 路径字符串
 * @param query 可选的查询参数对象，包含键值对，值的类型可以是字符串、数字或布尔值
 * @returns 构建好的完整 URL 字符串
 */
export declare function buildUrl(path: string, query?: Record<string, string | number | boolean>): string;

/** 当前页面实例 */
declare interface CurrentPage {
    /**
     * 页面的参数选项，通常包含从上个页面传递过来的查询参数。
     * 在小程序平台（如微信小程序、支付宝小程序等）中，该属性可直接获取页面参数。
     * 该属性为可选属性，可能不存在。
     */
    options?: Record<string, string>;
    /**
     * 页面的 Vue 实例，在 H5 和 App 平台可能会用到。
     * 该属性为可选属性，可能不存在。
     */
    $vm?: {
        /**
         * 在 H5 平台中，Vue 实例的路由信息对象。
         * 包含页面的查询参数等路由相关信息。
         * 该属性为可选属性，可能不存在。
         */
        $route?: {
            /**
             * H5 平台中，页面的查询参数对象。
             * 该属性为可选属性，可能不存在。
             */
            query?: Record<string, string>;
        };
        /**
         * 在 App 平台中，Vue 实例的小程序相关信息对象。
         * 包含页面的查询参数等信息。
         * 该属性为可选属性，可能不存在。
         */
        $mp?: {
            /**
             * App 平台中，页面的查询参数对象。
             * 该属性为可选属性，可能不存在。
             */
            query?: Record<string, string>;
        };
    };
    /**
     * 当前页面的路由路径。
     * 该属性为可选属性，可能不存在。
     */
    route?: string;
}

/**
 * 获取当前路由信息，根据传入的当前页面实例提取路由相关信息
 * @param currentPage 当前页面实例，可能为 null
 * @returns 当前路由对象，包含路径、完整路径和查询参数，若页面实例为 null 则返回 null
 */
export declare function getCurrentRoute(currentPage: CurrentPage | null): Route | null;

/** 路由链接组件的方法 */
declare interface MxRouterActionType {
    setProps: (mxRouterProps: MxRouterProps) => Promise<void>;
}

/** 路由链接组件 Props */
declare interface MxRouterProps {
    /** 路由地址 */
    to: RouteLocationRaw;
    /** 跳转方式 */
    method?: 'push' | 'replace' | 'tab' | 'launch' | 'back' | 'exit';
    /** 回退层数 */
    delta?: number;
    /** 窗口动画类型 */
    animationType?: UniApp.NavigateToOptions['animationType'] & UniApp.NavigateBackOptions['animationType'];
    /** 动画持续时间 */
    animationDuration?: number;
    /** 是否给 navigator 组件加一层 a 标签控制 ssr 渲染 */
    renderLink?: boolean;
    /** 指定点击时的样式类，当hover-class="none"时，没有点击态效果 */
    hoverClass?: string;
    /** 指定是否阻止本节点的祖先节点出现点击态 */
    hoverStopPropagation?: boolean;
    /** 按住后多久出现点击态，单位毫秒 */
    hoverStartTime?: number;
    /** 手指松开后点击态保留时间，单位毫秒 */
    hoverStayTime?: number;
    /** 在哪个小程序目标上发生跳转，默认当前小程序，值域self/miniProgram */
    target?: 'miniProgram' | 'self';
}

/**
 * 路由导航守卫函数
 * @param to 即将进入的路由
 * @param from 当前导航正要离开的路由
 * @param next 调用该方法来 resolve 这个钩子
 * @returns 可返回Promise或直接返回boolean/void
 */
declare type NavigationGuard = (to: Route, from: Route | null, next: NavigationGuardNextCallback) => Promise<boolean | void> | boolean | void;

/**
 * 路由导航守卫函数的回调参数
 * @param valid 导航是否有效，为false时取消导航，为字符串时重定向到指定路径，为RouteLocationRaw对象时进行路由跳转
 */
declare type NavigationGuardNextCallback = (valid?: boolean | string | RouteLocationRaw | void) => void;

/**
 * 解析路由位置，将传入的路由位置信息转换为统一的路径和查询参数格式
 * @param location 路由位置信息，可以是字符串类型的路径，也可以是包含路径和查询参数的对象
 * @returns 解析后的路径和可选的查询参数对象，查询参数对象的键值对均为字符串类型
 */
export declare function parseLocation(location: RouteLocationRaw): {
    path: string;
    query?: Record<string, string>;
};

/** 当前路由信息 */
declare interface Route {
    /** 路由路径 */
    path: string;
    /** 完整路径（包含查询参数） */
    fullPath: string;
    /** 解析后的查询参数对象 */
    query: Record<string, string>;
}

/** 路由配置项接口 */
declare interface RouteConfig {
    /** 路由路径 */
    path: string;
    /** 路由元信息，可存储任意自定义数据 */
    meta?: Record<string, unknown>;
    /** 子路由配置数组 */
    children?: RouteConfig[];
}

/** 路由位置描述对象 */
declare interface RouteLocation {
    /** 目标路径 */
    path: string;
    /** 查询参数对象 */
    query?: Record<string, string | number | boolean>;
}

/** 路由位置描述，可以是字符串路径或RouteLocation对象 */
declare type RouteLocationRaw = string | RouteLocation;

/**
 * uni-app 路由实现类，实现了 RouterInterface 接口，提供了一系列路由操作方法和守卫机制
 * 支持单例模式调用和实例调用两种方式
 */
export declare class Router implements RouterInterface {
    /**
     * 单例实例，用于单例模式调用
     * @private
     * @static
     * @type {Router | undefined}
     */
    private static instance;
    /**
     * 路由配置列表，存储所有的路由配置信息
     * @private
     * @type {RouteConfig[]}
     */
    private routes;
    /**
     * 全局前置守卫列表，在每次导航前依次执行
     * @private
     * @type {NavigationGuard[]}
     */
    private beforeEachHooks;
    /**
     * 全局后置钩子列表，在每次导航成功后依次执行
     * @private
     * @type {AfterEachHook[]}
     */
    private afterEachHooks;
    /**
     * 存储用户自定义的 getCurrentRoute 函数
     * @private
     * @type {(() => ReturnType<typeof getCurrentRouteUtil>) | undefined}
     */
    private customGetCurrentRoute;
    /**
     * 构造函数，初始化 Router 实例
     * 私有构造函数，防止外部直接实例化，保证单例模式的实现
     * @param {RouterOptions} [options={}] - 路由配置选项，包含路由配置列表等信息，默认为空对象
     */
    constructor(options?: RouterOptions);
    /**
     * 获取单例实例
     * 首次获取实例时需要传入路由配置选项，后续获取使用之前的配置
     * @static
     * @param {RouterOptions} [options] - 路由配置选项
     * @returns {Router} Router 实例
     */
    static getInstance(options?: RouterOptions): Router;
    /**
     * 以推入新页面的方式进行路由导航 - 静态方法
     * 通过单例实例调用实例方法实现路由导航
     * @static
     * @param {RouteLocationRaw} location - 目标路由位置信息，可以是字符串路径或包含路径和查询参数的对象
     * @param {RouterOpenAnimation} [animation] - 窗口显示动画配置
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    static push(location: RouteLocationRaw, animation?: RouterOpenAnimation): Promise<void>;
    /**
     * 以推入新页面的方式进行路由导航 - 实例方法
     * @param {RouteLocationRaw} location - 目标路由位置信息，可以是字符串路径或包含路径和查询参数的对象
     * @param {RouterOpenAnimation} [animation] - 窗口显示动画配置
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    push(location: RouteLocationRaw, animation?: RouterOpenAnimation): Promise<void>;
    /**
     * 以替换当前页面的方式进行路由导航 - 静态方法
     * 通过单例实例调用实例方法实现路由导航
     * @static
     * @param {RouteLocationRaw} location - 目标路由位置信息，可以是字符串路径或包含路径和查询参数的对象
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    static replace(location: RouteLocationRaw): Promise<void>;
    /**
     * 以替换当前页面的方式进行路由导航 - 实例方法
     * @param {RouteLocationRaw} location - 目标路由位置信息，可以是字符串路径或包含路径和查询参数的对象
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    replace(location: RouteLocationRaw): Promise<void>;
    /**
     * 以重新启动应用的方式进行路由导航 - 静态方法
     * 通过单例实例调用实例方法实现路由导航
     * @static
     * @param {RouteLocationRaw} location - 目标路由位置信息，可以是字符串路径或包含路径和查询参数的对象
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    static launch(location: RouteLocationRaw): Promise<void>;
    /**
     * 以重新启动应用的方式进行路由导航 - 实例方法
     * @param {RouteLocationRaw} location - 目标路由位置信息，可以是字符串路径或包含路径和查询参数的对象
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    launch(location: RouteLocationRaw): Promise<void>;
    /**
     * 切换到指定的 tab 页面 - 静态方法
     * 通过单例实例调用实例方法实现路由导航
     * @static
     * @param {RouteLocationRaw} location - 目标路由位置信息，可以是字符串路径或包含路径和查询参数的对象
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    static tab(location: RouteLocationRaw): Promise<void>;
    /**
     * 切换到指定的 tab 页面 - 实例方法
     * @param {RouteLocationRaw} location - 目标路由位置信息，可以是字符串路径或包含路径和查询参数的对象
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    tab(location: RouteLocationRaw): Promise<void>;
    /**
     * 返回到指定层数的上一个页面 - 静态方法
     * 通过单例实例调用实例方法实现页面返回
     * @static
     * @param {number} [delta=-1] - 要返回的页面层数，默认值为 -1，表示返回上一个页面
     * @param {RouterCloseAnimation} [animation] - 窗口关闭动画配置
     */
    static go(delta?: number, animation?: RouterCloseAnimation): void;
    /**
     * 返回到指定层数的上一个页面 - 实例方法
     * 调用 uni-app 的 navigateBack 方法实现页面返回
     * @param {number} [delta=-1] - 要返回的页面层数，默认值为 -1，表示返回上一个页面
     * @param {RouterCloseAnimation} [animation] - 窗口关闭动画配置
     */
    go(delta?: number, animation?: RouterCloseAnimation): void;
    /**
     * 返回到上一个页面，等同于调用 go(-1) - 静态方法
     * 通过单例实例调用实例方法实现页面返回
     * @static
     * @param {RouterCloseAnimation} [animation] - 窗口关闭动画配置
     */
    static back(animation?: RouterCloseAnimation): void;
    /**
     * 返回到上一个页面，等同于调用 go(-1) - 实例方法
     * 调用 go 方法实现页面返回
     * @param {RouterCloseAnimation} [animation] - 窗口关闭动画配置
     */
    back(animation?: RouterCloseAnimation): void;
    /**
     * 添加全局前置守卫到守卫列表中 - 静态方法
     * 通过单例实例调用实例方法添加全局前置守卫
     * 这些守卫会在每次导航前依次执行
     * @static
     * @param {NavigationGuard} guard - 全局前置守卫函数
     */
    static beforeEach(guard: NavigationGuard): void;
    /**
     * 添加全局前置守卫到守卫列表中 - 实例方法
     * 将全局前置守卫函数添加到前置守卫列表中
     * 这些守卫会在每次导航前依次执行
     * @param {NavigationGuard} guard - 全局前置守卫函数
     */
    beforeEach(guard: NavigationGuard): void;
    /**
     * 添加全局后置钩子到钩子列表中 - 静态方法
     * 通过单例实例调用实例方法添加全局后置钩子
     * 这些钩子会在每次导航成功后依次执行
     * @static
     * @param {AfterEachHook} hook - 全局后置钩子函数
     */
    static afterEach(hook: AfterEachHook): void;
    /**
     * 添加全局后置钩子到钩子列表中 - 实例方法
     * 将全局后置钩子函数添加到后置钩子列表中
     * 这些钩子会在每次导航成功后依次执行
     * @param {AfterEachHook} hook - 全局后置钩子函数
     */
    afterEach(hook: AfterEachHook): void;
    /**
     * 设置自定义的 getCurrentRoute 函数
     * @static
     * @param {() => ReturnType<typeof getCurrentRouteUtil>} customFunction - 自定义的 getCurrentRoute 函数
     */
    static setCustomGetCurrentRoute(customFunction: () => ReturnType<typeof getCurrentRoute>): void;
    /**
     * 设置自定义的 getCurrentRoute 函数
     * @param {() => ReturnType<typeof getCurrentRouteUtil>} customFunction - 自定义的 getCurrentRoute 函数
     */
    setCustomGetCurrentRoute(customFunction: () => ReturnType<typeof getCurrentRoute>): void;
    /**
     * 获取当前页面的路由信息 - 静态方法
     * 通过单例实例调用实例方法获取当前页面的路由信息
     * @static
     * @returns {ReturnType<typeof getCurrentRouteUtil> | null} 当前页面的路由信息对象，如果获取失败则返回 null
     */
    static getCurrentRoute(): ReturnType<typeof getCurrentRoute> | null;
    /**
     * 获取当前页面的路由信息 - 实例方法
     * 优先使用用户自定义的 getCurrentRoute 函数，若未定义则使用默认实现
     * @returns {ReturnType<typeof getCurrentRouteUtil> | null} 当前页面的路由信息对象，如果获取失败则返回 null
     */
    getCurrentRoute(): ReturnType<typeof getCurrentRoute> | null;
    /**
     * 执行路由导航操作，包含前置守卫和后置钩子的处理
     * @private
     * @param {RouteLocationRaw} location - 目标路由位置信息，可以是字符串路径或包含路径和查询参数的对象
     * @param {RouterMethod} method - 导航方法，如 'navigateTo'、'redirectTo' 等
     * @param {RouterOpenAnimation} [animation] - 窗口显示动画配置
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    private navigate;
    /**
     * 执行单个全局前置守卫函数
     * @private
     * @param {NavigationGuard} guard - 全局前置守卫函数
     * @param {any} to - 目标路由信息对象
     * @param {any} from - 当前路由信息对象
     * @returns {Promise<void>} 一个 Promise，守卫验证通过时 resolve，验证失败时 reject
     */
    private runGuard;
    /**
     * 调用 uni-app 的路由方法进行导航
     * @private
     * @param {RouterMethod} method - 导航方法，如 'navigateTo'、'redirectTo' 等
     * @param {string} url - 导航的目标 URL
     * @param {RouterOpenAnimation} [animation] - 窗口显示动画配置
     * @returns {Promise<void>} 一个 Promise，导航成功时 resolve，失败时 reject
     */
    private callMxMethod;
}

/** 窗口关闭动画配置 */
declare interface RouterCloseAnimation {
    /** 动画类型 */
    type?: UniApp.NavigateBackOptions['animationType'];
    /** 动画持续时间 */
    duration?: number;
}

/** uni-app路由类接口 */
declare interface RouterInterface {
    /** 跳转到指定页面（保留当前页面） */
    push(location: RouteLocationRaw): Promise<void>;
    /** 跳转到指定页面（关闭当前页面） */
    replace(location: RouteLocationRaw): Promise<void>;
    /** 跳转到指定页面（关闭所有页面） */
    launch(location: RouteLocationRaw): Promise<void>;
    /** 跳转到tabBar页面 */
    tab(location: RouteLocationRaw): Promise<void>;
    /** 返回指定页面数 */
    go(delta?: number): void;
    /** 返回上一页 */
    back(): void;
    /** 添加全局前置守卫 */
    beforeEach(guard: NavigationGuard): void;
    /** 添加全局后置钩子 */
    afterEach(hook: AfterEachHook): void;
    /** 获取当前路由信息 */
    getCurrentRoute(): Route | null;
}

/** 窗口显示动画配置 */
declare interface RouterOpenAnimation {
    /** 动画类型 */
    type?: UniApp.NavigateToOptions['animationType'];
    /** 动画持续时间 */
    duration?: number;
}

/** 路由构造器选项 */
declare interface RouterOptions {
    /** 路由配置数组 */
    routes?: RouteConfig[];
    /**
     * 自定义获取当前路由的函数
     * @returns 当前路由信息对象，如果获取失败则返回 null
     */
    customGetCurrentRoute?: () => Route | null;
}

/**
 * 使用 Router 组件的组合式函数，用于管理 Router 实例并提供操作方法
 *
 * @param routerProps - Router 组件的属性，用于配置路由跳转相关信息
 *
 * @returns 包含注册函数和操作方法的数组，第一个元素为注册函数，第二个元素为操作方法对象
 */
export declare function useMxRouter(routerProps: MxRouterProps): ({
    /**
     * 异步设置 Router 组件的属性
     *
     * @param routerProps - 要设置的 Router 组件属性
     */
    setProps: (routerProps: MxRouterProps) => Promise<void>;
} | ((instance: MxRouterActionType) => void))[];

export { }
