import * as pinia from 'pinia';
import * as vue_router from 'vue-router';
import { RouteRecordRaw, RouterOptions, RouteRecordName } from 'vue-router';
import * as vue from 'vue';
import { Component, PropType } from 'vue';

type IVrxArcoCheckPermission = (permission: any, data: any) => boolean;
interface IVrxArcoRouter {
    /**
     * 静态路由部分
     */
    routes: Readonly<RouteRecordRaw[]>;
    /**
     * 自定义路由创建参数
     * ```ts
     * createRouter({...options})
     * ```
     */
    options?: Omit<Partial<RouterOptions>, 'routes'>;
    /**
     * 动态路由部分
     */
    dynamicRoutes?: RouteRecordRaw[];
    /**
     * 根据从远程获取的权限，筛选每个路由
     * @param route
     * @param permission
     */
    filterDynamicRoutes?: (route: RouteRecordRaw, permission: any) => boolean;
    /**
     * 登陆过期重定向路由 name
     */
    loginExpiredRedirect: string;
    /**
     * 未登陆时 路由通过 name 白名单
     */
    whiteList?: string[];
    /**
     *  页面未找到 路由
     */
    pageNotFound: Omit<RouteRecordRaw, 'path'>;
}
interface IVrxArcAuthentication {
    /**
     * 判断是否已登陆
     */
    isLogin?: () => boolean | Promise<boolean>;
    /**
     * 登陆过期回调
     * 从远程获取权限报错，也会触发该方法
     */
    onLoginExpired?: () => any;
    /**
     * 从远程获取权限
     */
    getPermission?: () => Promise<any> | any;
    /**
     * 用于自定义局部鉴权
     */
    checkPermission?: IVrxArcoCheckPermission;
}
interface IVrxArcoApp {
    /**
     * 根组件
     */
    rootComponent: Component;
    /**
     * 根组件 props
     */
    rootProps?: Record<string, any>;
    /**
     * 渲染根节点
     */
    rootContainer: Element | string;
    /**
     * 路由配置
     */
    router: IVrxArcoRouter;
    /**
     *  路由遍历前后，添加加载状态控制
     * @param value
     */
    loading?: (value: boolean) => any;
    authentication?: IVrxArcAuthentication;
    /**
     * 是否立即初始化 vue app
     *
     * 设置为 false 可以取消默认的 vue app 初始化行为
     * @default true
     */
    immediate?: boolean;
}

declare const usePermissionStore: pinia.StoreDefinition<"vrx-permission", {
    dynamicRoutesName: RouteRecordName[];
    dynamicRoutes: RouteRecordRaw[];
    permission: any;
}, {}, {
    setDynamicRoutesName(routesName: Set<RouteRecordName>): void;
}>;

declare const Permission: vue.DefineComponent<vue.ExtractPropTypes<{
    data: PropType<any>;
    destroyOnNoPermission: {
        type: BooleanConstructor;
        default: boolean;
    };
}>, () => any[] | undefined, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
    data: PropType<any>;
    destroyOnNoPermission: {
        type: BooleanConstructor;
        default: boolean;
    };
}>> & Readonly<{}>, {
    destroyOnNoPermission: boolean;
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;

declare const createVrxArcoApp: (options: IVrxArcoApp) => {
    app: vue.App<Element>;
    router: vue_router.Router;
    pinia: pinia.Pinia;
    mount: () => Promise<vue.ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, vue.ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string, {}, {}, {}, string, vue.ComponentProvideOptions>, {}, {}, "", {}, any>>;
};

export { type IVrxArcAuthentication, type IVrxArcoApp, type IVrxArcoCheckPermission, type IVrxArcoRouter, Permission, createVrxArcoApp, usePermissionStore };
