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

package backup

import (
	"context"
	"fmt"
	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
	"github.com/aws/aws-sdk-go-v2/service/backup/types"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
	"time"
)

// Returns metadata associated with a recovery point, including ID, status,
// encryption, and lifecycle.
func (c *Client) DescribeRecoveryPoint(ctx context.Context, params *DescribeRecoveryPointInput, optFns ...func(*Options)) (*DescribeRecoveryPointOutput, error) {
	if params == nil {
		params = &DescribeRecoveryPointInput{}
	}

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

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

type DescribeRecoveryPointInput struct {

	// The name of a logical container where backups are stored. Backup vaults are
	// identified by names that are unique to the account used to create them and the
	// Amazon Web Services Region where they are created.
	//
	// This member is required.
	BackupVaultName *string

	// An Amazon Resource Name (ARN) that uniquely identifies a recovery point; for
	// example,
	// arn:aws:backup:us-east-1:123456789012:recovery-point:1EB3B5E7-9EB0-435A-A80B-108B488B0D45
	// .
	//
	// This member is required.
	RecoveryPointArn *string

	// The account ID of the specified backup vault.
	BackupVaultAccountId *string

	noSmithyDocumentSerde
}

type DescribeRecoveryPointOutput struct {

	// The size, in bytes, of a backup.
	BackupSizeInBytes *int64

	// An ARN that uniquely identifies a backup vault; for example,
	// arn:aws:backup:us-east-1:123456789012:backup-vault:aBackupVault .
	BackupVaultArn *string

	// The name of a logical container where backups are stored. Backup vaults are
	// identified by names that are unique to the account used to create them and the
	// Region where they are created.
	BackupVaultName *string

	// A CalculatedLifecycle object containing DeleteAt and MoveToColdStorageAt
	// timestamps.
	CalculatedLifecycle *types.CalculatedLifecycle

	// The date and time that a job to create a recovery point is completed, in Unix
	// format and Coordinated Universal Time (UTC). The value of CompletionDate is
	// accurate to milliseconds. For example, the value 1516925490.087 represents
	// Friday, January 26, 2018 12:11:30.087 AM.
	CompletionDate *time.Time

	// The identifier of a resource within a composite group, such as nested (child)
	// recovery point belonging to a composite (parent) stack. The ID is transferred
	// from the [logical ID]within a stack.
	//
	// [logical ID]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html#resources-section-structure-syntax
	CompositeMemberIdentifier *string

	// Contains identifying information about the creation of a recovery point,
	// including the BackupPlanArn , BackupPlanId , BackupPlanVersion , and
	// BackupRuleId of the backup plan used to create it.
	CreatedBy *types.RecoveryPointCreator

	// The date and time that a recovery point is created, in Unix format and
	// Coordinated Universal Time (UTC). The value of CreationDate is accurate to
	// milliseconds. For example, the value 1516925490.087 represents Friday, January
	// 26, 2018 12:11:30.087 AM.
	CreationDate *time.Time

	// The server-side encryption key used to protect your backups; for example,
	// arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab .
	EncryptionKeyArn *string

	// The type of encryption key used for the recovery point. Valid values are
	// CUSTOMER_MANAGED_KMS_KEY for customer-managed keys or Amazon Web
	// Services_OWNED_KMS_KEY for Amazon Web Services-owned keys.
	EncryptionKeyType types.EncryptionKeyType

	// Specifies the IAM role ARN used to create the target recovery point; for
	// example, arn:aws:iam::123456789012:role/S3Access .
	IamRoleArn *string

	// This is the current status for the backup index associated with the specified
	// recovery point.
	//
	// Statuses are: PENDING | ACTIVE | FAILED | DELETING
	//
	// A recovery point with an index that has the status of ACTIVE can be included in
	// a search.
	IndexStatus types.IndexStatus

	// A string in the form of a detailed message explaining the status of a backup
	// index associated with the recovery point.
	IndexStatusMessage *string

	// The date and time when the backup job that created this recovery point was
	// initiated, in Unix format and Coordinated Universal Time (UTC).
	InitiationDate *time.Time

	// A Boolean value that is returned as TRUE if the specified recovery point is
	// encrypted, or FALSE if the recovery point is not encrypted.
	IsEncrypted bool

	// This returns the boolean value that a recovery point is a parent (composite)
	// job.
	IsParent bool

	// The date and time that a recovery point was last restored, in Unix format and
	// Coordinated Universal Time (UTC). The value of LastRestoreTime is accurate to
	// milliseconds. For example, the value 1516925490.087 represents Friday, January
	// 26, 2018 12:11:30.087 AM.
	LastRestoreTime *time.Time

	// The lifecycle defines when a protected resource is transitioned to cold storage
	// and when it expires. Backup transitions and expires backups automatically
	// according to the lifecycle that you define.
	//
	// Backups that are transitioned to cold storage must be stored in cold storage
	// for a minimum of 90 days. Therefore, the “retention” setting must be 90 days
	// greater than the “transition to cold after days” setting. The “transition to
	// cold after days” setting cannot be changed after a backup has been transitioned
	// to cold.
	//
	// Resource types that can transition to cold storage are listed in the [Feature availability by resource] table.
	// Backup ignores this expression for other resource types.
	//
	// [Feature availability by resource]: https://docs.aws.amazon.com/aws-backup/latest/devguide/backup-feature-availability.html#features-by-resource
	Lifecycle *types.Lifecycle

	// This is an ARN that uniquely identifies a parent (composite) recovery point;
	// for example,
	// arn:aws:backup:us-east-1:123456789012:recovery-point:1EB3B5E7-9EB0-435A-A80B-108B488B0D45
	// .
	ParentRecoveryPointArn *string

	// An ARN that uniquely identifies a recovery point; for example,
	// arn:aws:backup:us-east-1:123456789012:recovery-point:1EB3B5E7-9EB0-435A-A80B-108B488B0D45
	// .
	RecoveryPointArn *string

	// An ARN that uniquely identifies a saved resource. The format of the ARN depends
	// on the resource type.
	ResourceArn *string

	// The name of the resource that belongs to the specified backup.
	ResourceName *string

	// The type of Amazon Web Services resource to save as a recovery point; for
	// example, an Amazon Elastic Block Store (Amazon EBS) volume or an Amazon
	// Relational Database Service (Amazon RDS) database.
	ResourceType *string

	// Contains the latest scanning results against the recovery point and currently
	// include MalwareScanner , ScanJobState , Findings , and LastScanTimestamp
	ScanResults []types.ScanResult

	// An Amazon Resource Name (ARN) that uniquely identifies the source vault where
	// the resource was originally backed up in; for example,
	// arn:aws:backup:us-east-1:123456789012:backup-vault:aBackupVault . If the
	// recovery is restored to the same Amazon Web Services account or Region, this
	// value will be null .
	SourceBackupVaultArn *string

	// A status code specifying the state of the recovery point. For more information,
	// see [Recovery point status]in the Backup Developer Guide.
	//
	//   - CREATING status indicates that an Backup job has been initiated for a
	//   resource. The backup process has started and is actively processing a backup job
	//   for the associated recovery point.
	//
	//   - AVAILABLE status indicates that the backup was successfully created for the
	//   recovery point. The backup process has completed without any issues, and the
	//   recovery point is now ready for use.
	//
	//   - PARTIAL status indicates a composite recovery point has one or more nested
	//   recovery points that were not in the backup.
	//
	//   - EXPIRED status indicates that the recovery point has exceeded its retention
	//   period, but Backup lacks permission or is otherwise unable to delete it. To
	//   manually delete these recovery points, see [Step 3: Delete the recovery points]in the Clean up resources section
	//   of Getting started.
	//
	//   - STOPPED status occurs on a continuous backup where a user has taken some
	//   action that causes the continuous backup to be disabled. This can be caused by
	//   the removal of permissions, turning off versioning, turning off events being
	//   sent to EventBridge, or disabling the EventBridge rules that are put in place by
	//   Backup. For recovery points of Amazon S3, Amazon RDS, and Amazon Aurora
	//   resources, this status occurs when the retention period of a continuous backup
	//   rule is changed.
	//
	// To resolve STOPPED status, ensure that all requested permissions are in place
	//   and that versioning is enabled on the S3 bucket. Once these conditions are met,
	//   the next instance of a backup rule running will result in a new continuous
	//   recovery point being created. The recovery points with STOPPED status do not
	//   need to be deleted.
	//
	// For SAP HANA on Amazon EC2 STOPPED status occurs due to user action, application
	//   misconfiguration, or backup failure. To ensure that future continuous backups
	//   succeed, refer to the recovery point status and check SAP HANA for details.
	//
	// [Step 3: Delete the recovery points]: https://docs.aws.amazon.com/aws-backup/latest/devguide/gs-cleanup-resources.html#cleanup-backups
	// [Recovery point status]: https://docs.aws.amazon.com/aws-backup/latest/devguide/applicationstackbackups.html#cfnrecoverypointstatus
	Status types.RecoveryPointStatus

	// A status message explaining the status of the recovery point.
	StatusMessage *string

	// Specifies the storage class of the recovery point. Valid values are WARM or COLD
	// .
	StorageClass types.StorageClass

	// The type of vault in which the described recovery point is stored.
	VaultType types.VaultType

	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationDescribeRecoveryPointMiddlewares(stack *middleware.Stack, options Options) (err error) {
	if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {
		return err
	}
	err = stack.Serialize.Add(&awsRestjson1_serializeOpDescribeRecoveryPoint{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsRestjson1_deserializeOpDescribeRecoveryPoint{}, middleware.After)
	if err != nil {
		return err
	}
	if err := addProtocolFinalizerMiddlewares(stack, options, "DescribeRecoveryPoint"); err != nil {
		return fmt.Errorf("add protocol finalizers: %v", err)
	}

	if err = addlegacyEndpointContextSetter(stack, options); err != nil {
		return err
	}
	if err = addSetLoggerMiddleware(stack, options); err != nil {
		return err
	}
	if err = addClientRequestID(stack); err != nil {
		return err
	}
	if err = addComputeContentLength(stack); err != nil {
		return err
	}
	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = addComputePayloadSHA256(stack); err != nil {
		return err
	}
	if err = addRetry(stack, options); err != nil {
		return err
	}
	if err = addRawResponseToMetadata(stack); err != nil {
		return err
	}
	if err = addRecordResponseTiming(stack); err != nil {
		return err
	}
	if err = addSpanRetryLoop(stack, options); err != nil {
		return err
	}
	if err = addClientUserAgent(stack, options); err != nil {
		return err
	}
	if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {
		return err
	}
	if err = addTimeOffsetBuild(stack, c); err != nil {
		return err
	}
	if err = addUserAgentRetryMode(stack, options); err != nil {
		return err
	}
	if err = addCredentialSource(stack, options); err != nil {
		return err
	}
	if err = addOpDescribeRecoveryPointValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opDescribeRecoveryPoint(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = addRecursionDetection(stack); 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
	}
	if err = addDisableHTTPSMiddleware(stack, options); err != nil {
		return err
	}
	if err = addInterceptBeforeRetryLoop(stack, options); err != nil {
		return err
	}
	if err = addInterceptAttempt(stack, options); err != nil {
		return err
	}
	if err = addInterceptors(stack, options); err != nil {
		return err
	}
	return nil
}

func newServiceMetadataMiddleware_opDescribeRecoveryPoint(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		OperationName: "DescribeRecoveryPoint",
	}
}
