import type { Construct } from 'constructs';
import type * as events from '../../aws-events';
import * as iam from '../../aws-iam';
import type * as lambda from '../../aws-lambda';
import type * as sns from '../../aws-sns';
import type * as sqs from '../../aws-sqs';
import type { IResource } from '../../core';
import { Resource } from '../../core';
import type { IExtensionRef, ExtensionReference } from '../../interfaces/generated/aws-appconfig-interfaces.generated';
/**
 * Defines Extension action points.
 *
 * @see https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions-about.html#working-with-appconfig-extensions-how-it-works-step-2
 */
export declare enum ActionPoint {
    PRE_CREATE_HOSTED_CONFIGURATION_VERSION = "PRE_CREATE_HOSTED_CONFIGURATION_VERSION",
    PRE_START_DEPLOYMENT = "PRE_START_DEPLOYMENT",
    ON_DEPLOYMENT_START = "ON_DEPLOYMENT_START",
    ON_DEPLOYMENT_STEP = "ON_DEPLOYMENT_STEP",
    ON_DEPLOYMENT_BAKING = "ON_DEPLOYMENT_BAKING",
    ON_DEPLOYMENT_COMPLETE = "ON_DEPLOYMENT_COMPLETE",
    ON_DEPLOYMENT_ROLLED_BACK = "ON_DEPLOYMENT_ROLLED_BACK",
    AT_DEPLOYMENT_TICK = "AT_DEPLOYMENT_TICK"
}
/**
 * Defines the source type for event destinations.
 */
export declare enum SourceType {
    LAMBDA = "lambda",
    SQS = "sqs",
    SNS = "sns",
    EVENTS = "events"
}
/**
 * Implemented by allowed extension event destinations.
 */
export interface IEventDestination {
    /**
     * The URI of the extension event destination.
     */
    readonly extensionUri: string;
    /**
     * The type of the extension event destination.
     */
    readonly type: SourceType;
    /**
     * The IAM policy document to invoke the event destination.
     */
    readonly policyDocument?: iam.PolicyDocument;
}
/**
 * Use an AWS Lambda function as an event destination.
 */
export declare class LambdaDestination implements IEventDestination {
    readonly extensionUri: string;
    readonly type: SourceType;
    readonly policyDocument?: iam.PolicyDocument;
    constructor(func: lambda.IFunction);
}
/**
 * Use an Amazon SQS queue as an event destination.
 */
export declare class SqsDestination implements IEventDestination {
    readonly extensionUri: string;
    readonly type: SourceType;
    readonly policyDocument?: iam.PolicyDocument;
    constructor(queue: sqs.IQueue);
}
/**
 * Use an Amazon SNS topic as an event destination.
 */
export declare class SnsDestination implements IEventDestination {
    readonly extensionUri: string;
    readonly type: SourceType;
    readonly policyDocument?: iam.PolicyDocument;
    constructor(topic: sns.ITopic);
}
/**
 * Use an Amazon EventBridge event bus as an event destination.
 */
export declare class EventBridgeDestination implements IEventDestination {
    readonly extensionUri: string;
    readonly type: SourceType;
    constructor(bus: events.IEventBusRef);
}
/**
 * Properties for the Action construct
 */
export interface ActionProps {
    /**
     * The action points that will trigger the extension action.
     */
    readonly actionPoints: ActionPoint[];
    /**
     * The event destination for the action.
     */
    readonly eventDestination: IEventDestination;
    /**
     * The name for the action.
     *
     * @default - A name is generated.
     */
    readonly name?: string;
    /**
     * The execution role for the action.
     *
     * @default - A role is generated.
     */
    readonly executionRole?: iam.IRole;
    /**
     * The description for the action.
     *
     * @default - No description.
     */
    readonly description?: string;
    /**
     * The flag that specifies whether or not to create the execution role.
     *
     * If set to true, then the role will not be auto-generated under the assumption
     * there is already the corresponding resource-based policy attached to the event
     * destination. If false, the execution role will be generated if not provided.
     *
     * @default false
     */
    readonly invokeWithoutExecutionRole?: boolean;
}
/**
 * Defines an action for an extension.
 */
export declare class Action {
    /**
     * The action points that will trigger the extension action.
     */
    readonly actionPoints: ActionPoint[];
    /**
     * The event destination for the action.
     */
    readonly eventDestination: IEventDestination;
    /**
     * The name for the action.
     */
    readonly name?: string;
    /**
     * The execution role for the action.
     */
    readonly executionRole?: iam.IRole;
    /**
     * The description for the action.
     */
    readonly description?: string;
    /**
     * The flag that specifies whether to create the execution role.
     */
    readonly invokeWithoutExecutionRole?: boolean;
    constructor(props: ActionProps);
}
/**
 * Defines a parameter for an extension.
 */
export declare class Parameter {
    /**
     * A required parameter for an extension.
     *
     * @param name The name of the parameter
     * @param value The value of the parameter
     * @param description A description for the parameter
     */
    static required(name: string, value: string, description?: string): Parameter;
    /**
     * An optional parameter for an extension.
     *
     * @param name The name of the parameter
     * @param value The value of the parameter
     * @param description A description for the parameter
     */
    static notRequired(name: string, value?: string, description?: string): Parameter;
    /**
     * The name of the parameter.
     */
    readonly name: string;
    /**
     * A boolean that indicates if the parameter is required or optional.
     */
    readonly isRequired: boolean;
    /**
     * The value of the parameter.
     */
    readonly value?: string;
    /**
     * The description of the parameter.
     */
    readonly description?: string;
    private constructor();
}
/**
 * Attributes of an existing AWS AppConfig extension to import.
 */
export interface ExtensionAttributes {
    /**
     * The ID of the extension.
     */
    readonly extensionId: string;
    /**
     * The version number of the extension.
     */
    readonly extensionVersionNumber: number;
    /**
     * The Amazon Resource Name (ARN) of the extension.
     *
     * @default - The extension ARN is generated.
     */
    readonly extensionArn?: string;
    /**
     * The actions of the extension.
     *
     * @default - None.
     */
    readonly actions?: Action[];
    /**
     * The name of the extension.
     *
     * @default - None.
     */
    readonly name?: string;
    /**
     * The description of the extension.
     *
     * @default - None.
     */
    readonly description?: string;
}
/**
 * Options for the Extension construct.
 */
export interface ExtensionOptions {
    /**
     * The name of the extension.
     *
     * @default - A name is generated.
     */
    readonly extensionName?: string;
    /**
     * A description of the extension
     *
     * @default - No description.
     */
    readonly description?: string;
    /**
     * The latest version number of the extension. When you create a new version,
     * specify the most recent current version number. For example, you create version 3,
     * enter 2 for this field.
     *
     * @default - None.
     */
    readonly latestVersionNumber?: number;
    /**
     * The parameters accepted for the extension.
     *
     * @default - None.
     */
    readonly parameters?: Parameter[];
}
/**
 * Properties for the Extension construct.
 */
export interface ExtensionProps extends ExtensionOptions {
    /**
     * The actions for the extension.
     */
    readonly actions: Action[];
}
/**
 * An AWS AppConfig extension.
 *
 * @resource AWS::AppConfig::Extension
 * @see https://docs.aws.amazon.com/appconfig/latest/userguide/working-with-appconfig-extensions.html
 */
export declare class Extension extends Resource implements IExtension {
    /** Uniquely identifies this class. */
    static readonly PROPERTY_INJECTION_ID: string;
    get extensionRef(): ExtensionReference;
    /**
     * Imports an extension into the CDK using its Amazon Resource Name (ARN).
     *
     * @param scope The parent construct
     * @param id The name of the extension construct
     * @param extensionArn The Amazon Resource Name (ARN) of the extension
     */
    static fromExtensionArn(scope: Construct, id: string, extensionArn: string): IExtension;
    /**
     * Imports an extension into the CDK using its attributes.
     *
     * @param scope The parent construct
     * @param id The name of the extension construct
     * @param attrs The attributes of the extension
     */
    static fromExtensionAttributes(scope: Construct, id: string, attrs: ExtensionAttributes): IExtension;
    /**
     * The actions for the extension.
     */
    readonly actions?: Action[];
    /**
     * The name of the extension.
     */
    readonly name?: string;
    /**
     * The description of the extension.
     */
    readonly description?: string;
    /**
     * The latest version number of the extension.
     */
    readonly latestVersionNumber?: number;
    /**
     * The parameters of the extension.
     */
    readonly parameters?: Parameter[];
    /**
     * The Amazon Resource Name (ARN) of the extension.
     *
     * @attribute
     */
    get extensionArn(): string;
    /**
     * The ID of the extension.
     *
     * @attribute
     */
    readonly extensionId: string;
    /**
     * The version number of the extension.
     *
     * @attribute
     */
    readonly extensionVersionNumber: number;
    private readonly _cfnExtension;
    private executionRole?;
    constructor(scope: Construct, id: string, props: ExtensionProps);
    private getExecutionRole;
}
export interface IExtension extends IResource, IExtensionRef {
    /**
     * The actions for the extension.
     */
    readonly actions?: Action[];
    /**
     * The name of the extension.
     */
    readonly name?: string;
    /**
     * The description of the extension.
     */
    readonly description?: string;
    /**
     * The latest version number of the extension.
     */
    readonly latestVersionNumber?: number;
    /**
     * The parameters of the extension.
     */
    readonly parameters?: Parameter[];
    /**
     * The Amazon Resource Name (ARN) of the extension.
     * @attribute
     */
    readonly extensionArn: string;
    /**
     * The ID of the extension.
     * @attribute
     */
    readonly extensionId: string;
    /**
     * The version number of the extension.
     * @attribute
     */
    readonly extensionVersionNumber: number;
}
/**
 * This class is meant to be used by AWS AppConfig resources (application,
 * configuration profile, environment) directly. There is currently no use
 * for this class outside of the AWS AppConfig construct implementation. It is
 * intended to be used with the resources since there is currently no way to
 * inherit from two classes (at least within JSII constraints).
 */
export declare class ExtensibleBase implements IExtensible {
    private resourceArn;
    private resourceName?;
    private scope;
    constructor(scope: Construct, resourceArn: string, resourceName?: string);
    on(actionPoint: ActionPoint, eventDestination: IEventDestination, options?: ExtensionOptions): void;
    preCreateHostedConfigurationVersion(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    preStartDeployment(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    onDeploymentStart(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    onDeploymentStep(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    onDeploymentBaking(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    onDeploymentComplete(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    onDeploymentRolledBack(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    atDeploymentTick(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    addExtension(extension: IExtension): void;
    private getExtensionForActionPoint;
    private addExtensionAssociation;
    private getExtensionHash;
    private getExtensionAssociationHash;
    private getExtensionDefaultName;
}
/**
 * Defines the extensible base implementation for extension association resources.
 */
export interface IExtensible {
    /**
     * Adds an extension defined by the action point and event destination and
     * also creates an extension association to the derived resource.
     *
     * @param actionPoint The action point which triggers the event
     * @param eventDestination The event that occurs during the extension
     * @param options Options for the extension
     */
    on(actionPoint: ActionPoint, eventDestination: IEventDestination, options?: ExtensionOptions): void;
    /**
     * Adds a PRE_CREATE_HOSTED_CONFIGURATION_VERSION extension with the provided event
     * destination and also creates an extension association to the derived resource.
     *
     * @param eventDestination The event that occurs during the extension
     * @param options Options for the extension
     */
    preCreateHostedConfigurationVersion(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    /**
     * Adds a PRE_START_DEPLOYMENT extension with the provided event destination and
     * also creates an extension association to the derived resource.
     *
     * @param eventDestination The event that occurs during the extension
     * @param options Options for the extension
     */
    preStartDeployment(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    /**
     * Adds an ON_DEPLOYMENT_START extension with the provided event destination and
     * also creates an extension association to the derived resource.
     *
     * @param eventDestination The event that occurs during the extension
     * @param options Options for the extension
     */
    onDeploymentStart(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    /**
     * Adds an ON_DEPLOYMENT_STEP extension with the provided event destination and
     * also creates an extension association to the derived resource.
     *
     * @param eventDestination The event that occurs during the extension
     * @param options Options for the extension
     */
    onDeploymentStep(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    /**
     * Adds an ON_DEPLOYMENT_BAKING extension with the provided event destination and
     * also creates an extension association to the derived resource.
     *
     * @param eventDestination The event that occurs during the extension
     * @param options Options for the extension
     */
    onDeploymentBaking(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    /**
     * Adds an ON_DEPLOYMENT_COMPLETE extension with the provided event destination and
     * also creates an extension association to the derived resource.
     *
     * @param eventDestination The event that occurs during the extension
     * @param options Options for the extension
     */
    onDeploymentComplete(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    /**
     * Adds an ON_DEPLOYMENT_ROLLED_BACK extension with the provided event destination and
     * also creates an extension association to the derived resource.
     *
     * @param eventDestination The event that occurs during the extension
     * @param options Options for the extension
     */
    onDeploymentRolledBack(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    /**
     * Adds an AT_DEPLOYMENT_TICK extension with the provided event destination and
     * also creates an extension association to the derived resource.
     *
     * @param eventDestination The event that occurs during the extension
     * @param options Options for the extension
     */
    atDeploymentTick(eventDestination: IEventDestination, options?: ExtensionOptions): void;
    /**
     * Adds an extension association to the derived resource.
     *
     * @param extension The extension to create an association for
     */
    addExtension(extension: IExtension): void;
}
