import type { SystemErrorsForOperationsMetricOptions, OperationsMetricOptions, ITable } from './shared';
import type { TableGrants } from './table-grants';
import type { IMetric, MetricOptions } from '../../aws-cloudwatch';
import { Metric } from '../../aws-cloudwatch';
import type { AddToResourcePolicyResult, GrantOnKeyResult, IGrantable, IResourceWithPolicy, PolicyDocument, PolicyStatement } from '../../aws-iam';
import { Grant } from '../../aws-iam';
import type { IKey } from '../../aws-kms';
import { Resource } from '../../core';
import type { TableReference } from '../../interfaces/generated/aws-dynamodb-interfaces.generated';
/**
 * Represents an instance of a DynamoDB table.
 */
export interface ITableV2 extends ITable {
    /**
     * The ID of the table.
     *
     * @attribute
     */
    readonly tableId?: string;
    /**
     * Grants for this table
     */
    readonly grants: TableGrants;
}
/**
 * Base class for a DynamoDB table.
 */
export declare abstract class TableBaseV2 extends Resource implements ITableV2, IResourceWithPolicy {
    /**
     * The ARN of the table.
     *
     * @attribute
     */
    abstract readonly tableArn: string;
    /**
     * The name of the table.
     *
     * @attribute
     */
    abstract readonly tableName: string;
    /**
     * The stream ARN of the table.
     *
     * @attribute
     */
    abstract readonly tableStreamArn?: string;
    /**
     * The ID of the table.
     *
     * @attribute
     */
    abstract readonly tableId?: string;
    /**
     * Grants for this table.
     */
    abstract readonly grants: TableGrants;
    /**
     * The KMS encryption key for the table.
     */
    abstract readonly encryptionKey?: IKey;
    /**
     * The resource policy for the table
     */
    abstract resourcePolicy?: PolicyDocument;
    protected abstract readonly region: string;
    protected abstract get hasIndex(): boolean;
    /**
     * A reference to this table.
     */
    get tableRef(): TableReference;
    /**
     * Adds an IAM policy statement associated with this table to an IAM principal's policy.
     *
     * Note: If `encryptionKey` is present, appropriate grants to the key needs to be added
     * separately using the `table.encryptionKey.grant*` methods.
     *
     * [disable-awslint:no-grants]
     *
     * @param grantee the principal (no-op if undefined)
     * @param actions the set of actions to allow (i.e., 'dynamodb:PutItem', 'dynamodb:GetItem', etc.)
     */
    grant(grantee: IGrantable, ...actions: string[]): Grant;
    /**
     * Adds an IAM policy statement associated with this table to an IAM principal's policy.
     *
     * Note: If `encryptionKey` is present, appropriate grants to the key needs to be added
     * separately using the `table.encryptionKey.grant*` methods.
     *
     * [disable-awslint:no-grants]
     *
     * @param grantee the principal (no-op if undefined)
     * @param actions the set of actions to allow (i.e., 'dynamodb:DescribeStream', 'dynamodb:GetRecords', etc.)
     */
    grantStream(grantee: IGrantable, ...actions: string[]): Grant;
    /**
     * Adds an IAM policy statement associated with this table to an IAM principal's policy.
     *
     * Actions: DescribeStream, GetRecords, GetShardIterator, ListStreams.
     *
     * Note: Appropriate grants will also be added to the customer-managed KMS keys associated with this
     * table if one was configured.
     *
     * [disable-awslint:no-grants]
     *
     * @param grantee the principal to grant access to
     */
    grantStreamRead(grantee: IGrantable): Grant;
    /**
     * Permits an IAM principal to list streams attached to this table.
     *
     * [disable-awslint:no-grants]
     *
     * @param grantee the principal to grant access to
     */
    grantTableListStreams(grantee: IGrantable): Grant;
    /**
     * Permits an IAM principal all data read operations on this table.
     *
     * Actions: BatchGetItem, GetRecords, GetShardIterator, Query, GetItem, Scan, DescribeTable.
     *
     * Note: Appropriate grants will also be added to the customer-managed KMS keys associated with this
     * table if one was configured.
     *
     * [disable-awslint:no-grants]
     *
     * @param grantee the principal to grant access to
     */
    grantReadData(grantee: IGrantable): Grant;
    /**
     * Permits an IAM principal all data write operations on this table.
     *
     * Actions: BatchWriteItem, PutItem, UpdateItem, DeleteItem, DescribeTable.
     *
     * Note: Appropriate grants will also be added to the customer-managed KMS keys associated with this
     * table if one was configured.
     *
     * [disable-awslint:no-grants]
     *
     * @param grantee the principal to grant access to
     */
    grantWriteData(grantee: IGrantable): Grant;
    /**
     * Permits an IAM principal to all data read/write operations on this table.
     *
     * Actions: BatchGetItem, GetRecords, GetShardIterator, Query, GetItem, Scan, BatchWriteItem, PutItem, UpdateItem,
     * DeleteItem, DescribeTable.
     *
     * Note: Appropriate grants will also be added to the customer-managed KMS keys associated with this
     * table if one was configured.
     *
     * [disable-awslint:no-grants]
     *
     * @param grantee the principal to grant access to
     */
    grantReadWriteData(grantee: IGrantable): Grant;
    /**
     * Permits an IAM principal to all DynamoDB operations ('dynamodb:*') on this table.
     *
     * Note: Appropriate grants will also be added to the customer-managed KMS keys associated with this
     * table if one was configured.
     *
     * [disable-awslint:no-grants]
     *
     * @param grantee the principal to grant access to
     */
    grantFullAccess(grantee: IGrantable): Grant;
    /**
     * Grants permissions on the table's encryption key.
     *
     * @param grantee the principal to grant access to
     * @param actions the KMS actions to grant
     */
    grantOnKey(grantee: IGrantable, ...actions: string[]): GrantOnKeyResult;
    /**
     * Return the given named metric for this table.
     *
     * By default, the metric will be calculated as a sum over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     */
    metric(metricName: string, props?: MetricOptions): Metric;
    /**
     * Metric for the consumed read capacity units for this table.
     *
     * By default, the metric will be calculated as a sum over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     */
    metricConsumedReadCapacityUnits(props?: MetricOptions): Metric;
    /**
     * Metric for the consumed write capacity units for this table.
     *
     * By default, the metric will be calculated as a sum over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     */
    metricConsumedWriteCapacityUnits(props?: MetricOptions): Metric;
    /**
     * Metric for the user errors for this table.
     *
     * Note: This metric reports user errors across all the tables in the account and region the table
     * resides in.
     *
     * By default, the metric will be calculated as a sum over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     */
    metricUserErrors(props?: MetricOptions): Metric;
    /**
     * Metric for the conditional check failed requests for this table.
     *
     * By default, the metric will be calculated as a sum over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     */
    metricConditionalCheckFailedRequests(props?: MetricOptions): Metric;
    /**
     * Metric for the successful request latency for this table.
     *
     * By default, the metric will be calculated as an average over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     */
    metricSuccessfulRequestLatency(props?: MetricOptions): Metric;
    /**
     * How many requests are throttled on this table for the given operation
     *
     * By default, the metric will be calculated as an average over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     */
    metricThrottledRequestsForOperation(operation: string, props?: OperationsMetricOptions): IMetric;
    /**
     * How many requests are throttled on this table. This will sum errors across all possible operations.
     *
     * By default, each individual metric will be calculated as a sum over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     */
    metricThrottledRequestsForOperations(props?: OperationsMetricOptions): IMetric;
    /**
     * Metric for the system errors for this table. This will sum errors across all possible operations.
     *
     * By default, each individual metric will be calculated as a sum over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     */
    metricSystemErrorsForOperations(props?: SystemErrorsForOperationsMetricOptions): IMetric;
    /**
     * How many requests are throttled on this table.
     *
     * By default, each individual metric will be calculated as a sum over a period of 5 minutes.
     * You can customize this by using the `statistic` and `period` properties.
     *
     * @deprecated Do not use this function. It returns an invalid metric. Use `metricThrottledRequestsForOperation` instead.
     */
    metricThrottledRequests(props?: MetricOptions): Metric;
    /**
     * Metric for the system errors this table
     *
     * @deprecated use `metricSystemErrorsForOperations`.
     */
    metricSystemErrors(props?: MetricOptions): Metric;
    /**
     * Create a math expression for operations.
     */
    private sumMetricsForOperations;
    /**
     * Create a map of metrics that can be used in a math expression.
     *
     * Using the return value of this function as the `usingMetrics` property in `cloudwatch.MathExpression` allows you to
     * use the keys of this map as metric names inside you expression.
     */
    private createMetricForOperations;
    /**
     * Adds an IAM policy statement associated with this table to an IAM principal's policy.
     *
     * @param grantee the principal (no-op if undefined)
     * @param options options for keyActions, tableActions, and streamActions
     */
    private combinedGrant;
    private configureMetric;
    /**
     * Adds a statement to the resource policy associated with this table.
     * A resource policy will be automatically created upon the first call to `addToResourcePolicy`.
     *
     * Note that this does not work with imported tables.
     *
     * @param statement The policy statement to add
     */
    abstract addToResourcePolicy(statement: PolicyStatement): AddToResourcePolicyResult;
}
