// Code generated by smithy-go-codegen DO NOT EDIT.

package backup

import (
	"context"
	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
	"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
)

// Applies Backup Vault Lock to a backup vault, preventing attempts to delete any
// recovery point stored in or created in a backup vault. Vault Lock also prevents
// attempts to update the lifecycle policy that controls the retention period of
// any recovery point currently stored in a backup vault. If specified, Vault Lock
// enforces a minimum and maximum retention period for future backup and copy jobs
// that target a backup vault. Backup Vault Lock has yet to receive a third-party
// assessment for SEC 17a-4(f) and CFTC.
func (c *Client) PutBackupVaultLockConfiguration(ctx context.Context, params *PutBackupVaultLockConfigurationInput, optFns ...func(*Options)) (*PutBackupVaultLockConfigurationOutput, error) {
	if params == nil {
		params = &PutBackupVaultLockConfigurationInput{}
	}

	result, metadata, err := c.invokeOperation(ctx, "PutBackupVaultLockConfiguration", params, optFns, c.addOperationPutBackupVaultLockConfigurationMiddlewares)
	if err != nil {
		return nil, err
	}

	out := result.(*PutBackupVaultLockConfigurationOutput)
	out.ResultMetadata = metadata
	return out, nil
}

type PutBackupVaultLockConfigurationInput struct {

	// The Backup Vault Lock configuration that specifies the name of the backup vault
	// it protects.
	//
	// This member is required.
	BackupVaultName *string

	// The Backup Vault Lock configuration that specifies the number of days before the
	// lock date. For example, setting ChangeableForDays to 30 on Jan. 1, 2022 at 8pm
	// UTC will set the lock date to Jan. 31, 2022 at 8pm UTC. Backup enforces a
	// 72-hour cooling-off period before Vault Lock takes effect and becomes immutable.
	// Therefore, you must set ChangeableForDays to 3 or greater. Before the lock date,
	// you can delete Vault Lock from the vault using
	// DeleteBackupVaultLockConfiguration or change the Vault Lock configuration using
	// PutBackupVaultLockConfiguration. On and after the lock date, the Vault Lock
	// becomes immutable and cannot be changed or deleted. If this parameter is not
	// specified, you can delete Vault Lock from the vault using
	// DeleteBackupVaultLockConfiguration or change the Vault Lock configuration using
	// PutBackupVaultLockConfiguration at any time.
	ChangeableForDays *int64

	// The Backup Vault Lock configuration that specifies the maximum retention period
	// that the vault retains its recovery points. This setting can be useful if, for
	// example, your organization's policies require you to destroy certain data after
	// retaining it for four years (1460 days). If this parameter is not included,
	// Vault Lock does not enforce a maximum retention period on the recovery points in
	// the vault. If this parameter is included without a value, Vault Lock will not
	// enforce a maximum retention period. If this parameter is specified, any backup
	// or copy job to the vault must have a lifecycle policy with a retention period
	// equal to or shorter than the maximum retention period. If the job's retention
	// period is longer than that maximum retention period, then the vault fails the
	// backup or copy job, and you should either modify your lifecycle settings or use
	// a different vault. The longest maximum retention period you can specify is 36500
	// days (approximately 100 years). Recovery points already saved in the vault prior
	// to Vault Lock are not affected.
	MaxRetentionDays *int64

	// The Backup Vault Lock configuration that specifies the minimum retention period
	// that the vault retains its recovery points. This setting can be useful if, for
	// example, your organization's policies require you to retain certain data for at
	// least seven years (2555 days). If this parameter is not specified, Vault Lock
	// will not enforce a minimum retention period. If this parameter is specified, any
	// backup or copy job to the vault must have a lifecycle policy with a retention
	// period equal to or longer than the minimum retention period. If the job's
	// retention period is shorter than that minimum retention period, then the vault
	// fails that backup or copy job, and you should either modify your lifecycle
	// settings or use a different vault. The shortest minimum retention period you can
	// specify is 1 day. Recovery points already saved in the vault prior to Vault Lock
	// are not affected.
	MinRetentionDays *int64

	noSmithyDocumentSerde
}

type PutBackupVaultLockConfigurationOutput struct {
	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationPutBackupVaultLockConfigurationMiddlewares(stack *middleware.Stack, options Options) (err error) {
	err = stack.Serialize.Add(&awsRestjson1_serializeOpPutBackupVaultLockConfiguration{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsRestjson1_deserializeOpPutBackupVaultLockConfiguration{}, middleware.After)
	if err != nil {
		return err
	}
	if err = addSetLoggerMiddleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddClientRequestIDMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddComputeContentLengthMiddleware(stack); err != nil {
		return err
	}
	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = v4.AddComputePayloadSHA256Middleware(stack); err != nil {
		return err
	}
	if err = addRetryMiddlewares(stack, options); err != nil {
		return err
	}
	if err = addHTTPSignerV4Middleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddRawResponseToMetadata(stack); err != nil {
		return err
	}
	if err = awsmiddleware.AddRecordResponseTiming(stack); err != nil {
		return err
	}
	if err = addClientUserAgent(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addOpPutBackupVaultLockConfigurationValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opPutBackupVaultLockConfiguration(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = addRequestIDRetrieverMiddleware(stack); err != nil {
		return err
	}
	if err = addResponseErrorMiddleware(stack); err != nil {
		return err
	}
	if err = addRequestResponseLogging(stack, options); err != nil {
		return err
	}
	return nil
}

func newServiceMetadataMiddleware_opPutBackupVaultLockConfiguration(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		SigningName:   "backup",
		OperationName: "PutBackupVaultLockConfiguration",
	}
}
