import { IPluginMethodMap, IIdentifier, IAgentContext, IDataStoreORM, IResolver, IDIDManager, ICredentialPlugin, PresentationPayload, IAgentPlugin, ProofFormat } from '@veramo/core';
import { IIdentifierResolution, ManagedIdentifierOptsOrResult } from '@sphereon/ssi-sdk-ext.identifier-resolution';
import { CredentialRole, W3CVerifiableCredential, IPresentation, Optional, SdJwtDecodedVerifiableCredential, W3CVerifiablePresentation } from '@sphereon/ssi-types';
import { IPresentationDefinition, PEVersion, SelectResults } from '@sphereon/pex';
import { Format, InputDescriptorV1, InputDescriptorV2 } from '@sphereon/pex-models';
import { FindDigitalCredentialArgs } from '@sphereon/ssi-sdk.data-store-types';
import { ISDJwtPlugin } from '@sphereon/ssi-sdk.sd-jwt';

interface IPresentationExchange extends IPluginMethodMap {
    pexValidateDefinition(args: IDefinitionValidateArgs): Promise<boolean>;
    pexDefinitionVersion(presentationDefinition: IPresentationDefinition): Promise<VersionDiscoveryResult>;
    pexDefinitionFilterCredentials(args: IDefinitionCredentialFilterArgs, context: IRequiredContext): Promise<IPEXFilterResult>;
    pexDefinitionFilterCredentialsPerInputDescriptor(args: IDefinitionCredentialFilterArgs, context: IRequiredContext): Promise<IPEXFilterResultWithInputDescriptor[]>;
}
interface IDefinitionValidateArgs {
    definition: IPresentationDefinition;
}
interface IDefinitionCredentialFilterArgs {
    presentationDefinition: IPresentationDefinition;
    credentialFilterOpts: {
        credentialRole: CredentialRole;
        verifiableCredentials?: W3CVerifiableCredential[];
        filter?: FindDigitalCredentialArgs;
    };
    holderDIDs?: (string | IIdentifier)[];
    limitDisclosureSignatureSuites?: string[];
    restrictToFormats?: Format;
    restrictToDIDMethods?: string[];
}
interface PEXOpts {
    defaultStore?: string;
    defaultNamespace?: string;
}
interface IPEXOptions {
    definition?: IPresentationDefinition;
    definitionId: string;
}
interface IPEXFilterResultWithInputDescriptor extends IPEXFilterResult {
    inputDescriptor: InputDescriptorV1 | InputDescriptorV2;
}
interface IPEXFilterResult {
    id: string;
    selectResults: SelectResults;
    filteredCredentials: W3CVerifiableCredential[];
}
interface VersionDiscoveryResult {
    version?: PEVersion;
    error?: string;
}
type IPEXPresentationSignCallback = (args: IPEXPresentationSignCallBackParams) => Promise<W3CVerifiablePresentation>;
interface IPEXPresentationSignCallBackParams {
    presentation: IPresentation | Optional<PresentationPayload, 'holder'> | SdJwtDecodedVerifiableCredential;
    presentationDefinition: IPresentationDefinition;
}
type IRequiredContext = IAgentContext<IDataStoreORM & IResolver & IDIDManager & IIdentifierResolution & ICredentialPlugin & ISDJwtPlugin>;

declare class PresentationExchange implements IAgentPlugin {
    readonly schema: any;
    private readonly pex;
    readonly methods: IPresentationExchange;
    constructor(opts?: PEXOpts);
    private pexValidateDefinition;
    pexDefinitionVersion(presentationDefinition: IPresentationDefinition): Promise<VersionDiscoveryResult>;
    pexDefinitionFilterCredentials(args: IDefinitionCredentialFilterArgs, context: IRequiredContext): Promise<IPEXFilterResult>;
    pexDefinitionFilterCredentialsPerInputDescriptor(args: IDefinitionCredentialFilterArgs, context: IRequiredContext): Promise<IPEXFilterResultWithInputDescriptor[]>;
    private pexFilterCredentials;
}

declare function createPEXPresentationSignCallback(args: {
    idOpts: ManagedIdentifierOptsOrResult;
    fetchRemoteContexts?: boolean;
    skipDidResolution?: boolean;
    format?: Format | ProofFormat;
    domain?: string;
    challenge?: string;
}, context: IRequiredContext): Promise<IPEXPresentationSignCallback>;

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

export { type IDefinitionCredentialFilterArgs, type IDefinitionValidateArgs, type IPEXFilterResult, type IPEXFilterResultWithInputDescriptor, type IPEXOptions, type IPEXPresentationSignCallBackParams, type IPEXPresentationSignCallback, type IPresentationExchange, type IRequiredContext, type PEXOpts, PresentationExchange, type VersionDiscoveryResult, createPEXPresentationSignCallback, schema };
