/**
 * @license
 * Universis Project Version 1.0
 * Copyright (c) 2018, Universis Project All rights reserved
 *
 * Use of this source code is governed by an LGPL 3.0 license that can be
 * found in the LICENSE file at https://universis.io/license
 */
import {ApplicationBase, ApplicationService, ConfigurationBase, ConfigurationStrategy} from '@themost/common';

export declare class ScopeString {
    constructor(str: string);
    split(): string[];
}

export declare interface UniversisConfigurationSection {
    universis: {
        [k: string]: any;
    }
}

export declare interface ScopeAccessConfigurationSection {
    janitor: {
        scopeAccess: {
            imports: string[]
        }
    }
}

/**
 * Declares a configuration element for managing scope-based permissions on server resources
 */
export declare interface ScopeAccessConfigurationElement {
    /**
     * Gets or sets an array of strings that holds an array of scopes e.g. students or students:read or students,teachers etc
     */
    scope: string[],
    /**
     * Gets or sets a string which represents the regular expression that is going to be used for validating endpoint
     */
    resource: string;
    /**
     * Gets or sets an array of strings which represents the access levels for the given scopes e.g. READ or READ,WRITE etc
     */
    access: string[];
    /**
     * Gets or sets a string which represents a short description for this item
     */
    description?: string;
}

export declare class ScopeAccessConfiguration extends ConfigurationStrategy {

    constructor(configuration: ConfigurationBase);

    /**
     * Gets an array of scope access configuration elements
     */
    public elements: ScopeAccessConfigurationElement[];

    /**
     * Verifies the given request and returns a promise that resolves with a scope access configuration element
     */
    verify(req: Request): Promise<ScopeAccessConfigurationElement>;
}

export declare class DefaultScopeAccessConfiguration extends ScopeAccessConfiguration {

    constructor(configuration: ConfigurationBase);
    /**
     * Gets an array of scope access configuration elements
     */
    public elements: ScopeAccessConfigurationElement[];
    /**
     * Verifies the given request and returns a promise that resolves with a scope access configuration element
     */
    verify(req: Request): Promise<ScopeAccessConfigurationElement>;

}

export declare class EnableScopeAccessConfiguration extends ApplicationService {
    constructor(app: ApplicationBase);
}

export declare class ExtendScopeAccessConfiguration extends ApplicationService {
    constructor(app: ApplicationBase);
}
