import { Router, RouteLocationNormalized, NavigationGuardNext, NavigationGuardReturn, NavigationGuard } from 'vue-router';
import { Ref } from 'vue';

export const access: {
    hasAccess(accessId: string | number): Promise<boolean>;
    isDataReady(): boolean;
    setRole(roleId: string | Promise<string>): void;
    setAccess(accessIds: Array<string | number> | Promise<Array<string | number>>): void;
    getAccess(): string[];
};

export function useAccess(accessId: Array<string | number>): Ref<boolean>;

interface CustomNavigationGuardOption {
    router: Router;
    to: RouteLocationNormalized;
    from: RouteLocationNormalized;
    next: NavigationGuardNext;
}

interface CustomNavigationGuard {
    (option: CustomNavigationGuardOption): NavigationGuardReturn | Promise<NavigationGuardReturn>;
}

declare module '@fesjs/fes' {
    interface PluginBuildConfig {
        access?:
            | {
                  rules: Record<string, []>;
              }
            | false;
    }

    interface PluginRuntimeConfig {
        access?: {
            noFoundHandler: NavigationGuard;
            unAccessHandler: CustomNavigationGuard;
        };
    }
}