import { GenericAuthArgs, ISingleEndpointOpts, ExpressSupport } from '@sphereon/ssi-express-support';
import { IContactManager } from '@sphereon/ssi-sdk.contact-manager';
import { IKeyManager, IDIDManager, IAgentContext, TAgent } from '@veramo/core';
import { Express, Router } from 'express';

type ContactManagerMRestApiFeatures = 'party_read' | 'party_write' | 'party_type_read' | 'identity_read';
interface IContactManagerAPIEndpointOpts {
    endpointOpts?: {
        basePath?: string;
        globalAuth?: GenericAuthArgs & {
            secureContactManagerEndpoints?: boolean;
        };
        partyRead?: ISingleEndpointOpts;
        partyWrite?: ISingleEndpointOpts;
        partyTypeRead?: ISingleEndpointOpts;
        identityRead?: ISingleEndpointOpts;
    };
    enableFeatures?: ContactManagerMRestApiFeatures[];
}
type IRequiredPlugins = IContactManager & IKeyManager & IDIDManager;
type IRequiredContext = IAgentContext<IRequiredPlugins>;

declare class ContactManagerApiServer {
    private readonly _express;
    private readonly _agent;
    private readonly _opts?;
    private readonly _router;
    constructor(args: {
        agent: TAgent<IRequiredPlugins>;
        expressSupport: ExpressSupport;
        opts?: IContactManagerAPIEndpointOpts;
    });
    get express(): Express;
    get router(): Router;
    get agent(): TAgent<IRequiredPlugins>;
    get opts(): IContactManagerAPIEndpointOpts | undefined;
}

declare function partiesReadEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
declare function partyReadEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
declare function partyWriteEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
declare function partyDeleteEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
declare function partiesTypeReadEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
declare function partyTypeReadEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
declare function identitiesReadEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
declare function identityReadEndpoints(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;

export { ContactManagerApiServer, type ContactManagerMRestApiFeatures, type IContactManagerAPIEndpointOpts, type IRequiredContext, type IRequiredPlugins, identitiesReadEndpoint, identityReadEndpoints, partiesReadEndpoint, partiesTypeReadEndpoint, partyDeleteEndpoint, partyReadEndpoint, partyTypeReadEndpoint, partyWriteEndpoint };
