import * as i0 from '@angular/core';
import { InjectionToken } from '@angular/core';
import { MaybeAsync } from '@sdcorejs/utils/models';
import { CanActivate, CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

/**
 * Cấu hình trung tâm cho module permission.
 *
 * Luồng hoạt động chính:
 * 1. `loadPermissions(key?)` ở service được gọi để lấy danh sách mã quyền theo từng `key` cấu hình.
 * 2. Guard/service đối chiếu mã quyền theo route metadata.
 * 3. Khi không đủ quyền, callback `onForbiden()` sẽ được gọi (nếu có).
 *
 * Lưu ý:
 * - `SD_PERMISSION_CONFIGURATION` hỗ trợ cả cấu hình đơn và mảng cấu hình (`multi: true`).
 * - Nếu cần tạm bỏ qua kiểm tra quyền (POC/UAT cục bộ), đặt `disabled = true`.
 */
interface ISdPermissionConfiguration {
    /**
     * Khóa định danh cấu hình.
      * Dùng để phân biệt khi hệ thống mở rộng theo nhiều profile permission.
      *
      * Lưu ý: `undefined` cũng được xem là một key hợp lệ (cấu hình mặc định).
     */
    key?: string;
    /**
     * Bật/tắt kiểm tra permission toàn cục.
     * - `true`: bỏ qua kiểm tra quyền.
     * - `false | undefined`: kiểm tra quyền theo cấu hình route.
     */
    disabled?: boolean;
    /**
     * Trả về danh sách mã quyền của user hiện tại.
     * Có thể đồng bộ hoặc bất đồng bộ.
     *
     * Ví dụ giá trị trả về:
     * - `['PRODUCT_C_EMPLOYEE_VIEW', 'PRODUCT_C_EMPLOYEE_UPDATE']`
     */
    loadPermissions: () => MaybeAsync<string[]>;
    /**
     * Callback xử lý khi user không có quyền truy cập URL hiện tại.
     * Thường dùng để điều hướng sang trang forbidden hoặc hiển thị thông báo.
     *
     * Giữ nguyên tên `onForbiden` để tương thích API hiện tại.
     */
    onForbiden?: () => void;
    /**
     * Cung cấp access token hiện tại cho các tác vụ liên quan permission.
     * Hỗ trợ trả về đồng bộ, Promise hoặc Observable.
     */
    getToken?: () => MaybeAsync<string | undefined | null>;
}
/**
 * InjectionToken cho cấu hình permission.
 *
 * Ví dụ provider:
 * {
 *   provide: SD_PERMISSION_CONFIGURATION,
 *   useValue: {
 *     disabled: false,
 *     loadPermissions: () => ['SAMPLE_C_EMPLOYEE_VIEW'],
 *     onForbiden: () => router.navigateByUrl('/layout/forbidden')
 *   }
 * }
 */
declare const SD_PERMISSION_CONFIGURATION: InjectionToken<ISdPermissionConfiguration | ISdPermissionConfiguration[]>;

declare class SdPermissionService {
    #private;
    constructor();
    loadPermissions: (key?: string) => Promise<string[]>;
    loadAllPermissions: () => Promise<void>;
    hasPermission: (permission: string | string[], key?: string) => boolean;
    getToken: (key?: string) => Promise<string | null | undefined>;
    decodeToken: <T>(key?: string) => Promise<T | null>;
    static ɵfac: i0.ɵɵFactoryDeclaration<SdPermissionService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SdPermissionService>;
}

declare class SdPermissionDirective {
    #private;
    readonly sdPermission: i0.InputSignal<string | string[] | null | undefined>;
    readonly sdPermissionKey: i0.InputSignal<string | undefined>;
    constructor();
    static ɵfac: i0.ɵɵFactoryDeclaration<SdPermissionDirective, never>;
    static ɵdir: i0.ɵɵDirectiveDeclaration<SdPermissionDirective, "[sdPermission]", never, { "sdPermission": { "alias": "sdPermission"; "required": false; "isSignal": true; }; "sdPermissionKey": { "alias": "sdPermissionKey"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
}

declare class SdPermissionGuard implements CanActivate, CanActivateChild {
    #private;
    private configuration;
    private permissionService;
    constructor(configuration: ISdPermissionConfiguration | ISdPermissionConfiguration[], permissionService: SdPermissionService);
    canActivate: (next: ActivatedRouteSnapshot, state: RouterStateSnapshot) => Promise<boolean>;
    canActivateChild: (activatedRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot) => Promise<boolean>;
    static ɵfac: i0.ɵɵFactoryDeclaration<SdPermissionGuard, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<SdPermissionGuard>;
}

export { SD_PERMISSION_CONFIGURATION, SdPermissionDirective, SdPermissionGuard, SdPermissionService };
export type { ISdPermissionConfiguration };
