import { Credential } from '@veramo/data-store';
import { BaseEntity, Connection, MigrationInterface, QueryRunner } from 'typeorm';
import { IDidConfigurationResource, IIssueDomainLinkageCredentialOptions, IssuanceCallback, DomainLinkageCredential } from '@sphereon/wellknown-dids-client';
import { IPluginMethodMap, IAgentContext, IDIDManager, IAgentPlugin } from '@veramo/core';
import { OrPromise } from '@veramo/utils';
import { ICredentialStore } from '@sphereon/ssi-sdk.credential-store';

declare class DidConfigurationResourceEntity extends BaseEntity {
    origin: string;
    context: string;
    linkedDids: Array<Credential>;
    createdAt: Date;
    lastUpdatedAt: Date;
}

interface IWellKnownDidIssuer extends IPluginMethodMap {
    addLinkedDomainsService(args: IAddLinkedDomainsServiceArgs, context: RequiredContext): Promise<void>;
    getDidConfigurationResource(args: IGetDidConfigurationResourceArgs, context: RequiredContext): Promise<IDidConfigurationResource>;
    issueDidConfigurationResource(args: IIssueDidConfigurationResourceArgs, context: RequiredContext): Promise<IDidConfigurationResource>;
    issueDomainLinkageCredential(args: IIssueDomainLinkageCredentialArgs, context: RequiredContext): Promise<DomainLinkageCredential>;
    registerCredentialIssuance(args: IRegisterIssueCredentialArgs, context: RequiredContext): Promise<void>;
    removeCredentialIssuance(args: IRemoveCredentialIssuanceArgs, context: RequiredContext): Promise<boolean>;
    saveDidConfigurationResource(args: ISaveDidConfigurationResourceArgs, context: RequiredContext): Promise<void>;
}
interface IWellKnownDidIssuerOptionsArgs {
    credentialIssuances?: Record<string, IssuanceCallback>;
}
interface IRegisterIssueCredentialArgs {
    callbackName: string;
    credentialIssuance: IssuanceCallback;
}
interface IRemoveCredentialIssuanceArgs {
    callbackName: string;
}
interface IIssueDidConfigurationResourceArgs {
    issuances: Array<IIssueDomainLinkageCredentialArgs>;
    credentialIssuance?: string | IssuanceCallback;
    save?: boolean;
}
interface IIssueDomainLinkageCredentialArgs {
    did: string;
    origin: string;
    serviceId?: string;
    issuanceDate?: string;
    expirationDate: string;
    save?: boolean;
    options: IIssueDomainLinkageCredentialOptions;
    credentialIssuance?: string | IssuanceCallback;
}
interface IGetDidConfigurationResourceArgs {
    origin: string;
}
interface IAddLinkedDomainsServiceArgs {
    did: string;
    origin: string;
    serviceId?: string;
}
interface ISaveDidConfigurationResourceArgs {
    origin: string;
    didConfigurationResource: IDidConfigurationResource;
}
type RequiredContext = IAgentContext<IDIDManager & ICredentialStore>;

/**
 * {@inheritDoc IWellKnownDidIssuer}
 */
declare class WellKnownDidIssuer implements IAgentPlugin {
    private dbConnection;
    readonly schema: any;
    readonly methods: IWellKnownDidIssuer;
    private readonly credentialIssuances;
    private readonly didConfigurationResourceRelations;
    constructor(dbConnection: OrPromise<Connection>, args?: IWellKnownDidIssuerOptionsArgs);
    /** {@inheritDoc IWellKnownDidIssuer.registerSignatureVerification} */
    private registerCredentialIssuance;
    /** {@inheritDoc IWellKnownDidIssuer.removeSignatureVerification} */
    private removeCredentialIssuance;
    /** {@inheritDoc IWellKnownDidIssuer.issueDidConfigurationResource} */
    private issueDidConfigurationResource;
    /** {@inheritDoc IWellKnownDidIssuer.saveDidConfigurationResource} */
    saveDidConfigurationResource(args: ISaveDidConfigurationResourceArgs, context: RequiredContext): Promise<void>;
    /** {@inheritDoc IWellKnownDidIssuer.getDidConfigurationResource} */
    getDidConfigurationResource(args: IGetDidConfigurationResourceArgs, context: RequiredContext): Promise<IDidConfigurationResource>;
    /** {@inheritDoc IWellKnownDidIssuer.issueDomainLinkageCredential} */
    issueDomainLinkageCredential(args: IIssueDomainLinkageCredentialArgs, context: RequiredContext): Promise<DomainLinkageCredential>;
    /** {@inheritDoc IWellKnownDidIssuer.addLinkedDomainsService} */
    addLinkedDomainsService(args: IAddLinkedDomainsServiceArgs, context: RequiredContext): Promise<void>;
    private getCredentialIssuance;
    private saveDomainLinkageCredential;
    private normalizeCredential;
    private mapIssuances;
}

declare class CreateWellknownDidIssuer1661162010000 implements MigrationInterface {
    name: string;
    up(queryRunner: QueryRunner): Promise<void>;
    down(queryRunner: QueryRunner): Promise<void>;
}

/**
 * The migrations array that SHOULD be used when initializing a TypeORM database connection.
 *
 * These ensure the correct creation of tables and the proper migrations of data when tables change between versions.
 *
 * @public
 */
declare const WellknownDidIssuerMigrations: (typeof CreateWellknownDidIssuer1661162010000)[];

/**
 * @public
 */
declare const schema: any;

declare const WellknownDidIssuerEntities: (typeof DidConfigurationResourceEntity)[];

export { DidConfigurationResourceEntity, type IAddLinkedDomainsServiceArgs, type IGetDidConfigurationResourceArgs, type IIssueDidConfigurationResourceArgs, type IIssueDomainLinkageCredentialArgs, type IRegisterIssueCredentialArgs, type IRemoveCredentialIssuanceArgs, type ISaveDidConfigurationResourceArgs, type IWellKnownDidIssuer, type IWellKnownDidIssuerOptionsArgs, type RequiredContext, WellKnownDidIssuer, WellknownDidIssuerEntities, WellknownDidIssuerMigrations, schema };
