import boto3
from botocore.exceptions import ClientError
import time

# A script to create and retrieve a secret in AWS Secrets Manager using Boto3.

# --- Configuration ---
REGION = "us-east-1"
SECRET_NAME = "MyBoto3AppSecret"
SECRET_VALUE = "MySuperSecretValue123!"
SECRET_DESCRIPTION = "Secret for my Boto3 application"

secretsmanager_client = boto3.client('secretsmanager', region_name=REGION)

def create_secret():
    """Creates a new secret."""
    print(f"--- Creating Secrets Manager secret: {SECRET_NAME} ---")
    try:
        response = secretsmanager_client.create_secret(
            Name=SECRET_NAME,
            SecretString=SECRET_VALUE,
            Description=SECRET_DESCRIPTION
        )
        secret_arn = response['ARN']
        print(f"Secret '{SECRET_NAME}' created with ARN: {secret_arn}")
        return secret_arn
    except ClientError as e:
        if e.response['Error']['Code'] == 'ResourceExistsException':
            print(f"Secret '{SECRET_NAME}' already exists. Skipping creation.")
            response = secretsmanager_client.describe_secret(SecretId=SECRET_NAME)
            return response['ARN']
        else:
            print(f"Error creating secret: {e}")
            raise

def get_secret_value():
    """Retrieves the value of the created secret."""
    print(f"\n--- Getting secret value for: {SECRET_NAME} ---")
    try:
        response = secretsmanager_client.get_secret_value(SecretId=SECRET_NAME)
        secret_retrieved_value = response['SecretString']
        print(f"Retrieved secret value: {secret_retrieved_value}")
        return secret_retrieved_value
    except ClientError as e:
        print(f"Error getting secret value: {e}")
        raise

def delete_secret():
    """Deletes the secret."""
    print(f"\n--- Deleting secret: {SECRET_NAME} ---")
    try:
        secretsmanager_client.delete_secret(
            SecretId=SECRET_NAME,
            ForceDeleteWithoutRecovery=True # For immediate deletion in demo
        )
        print("Secret deleted.")
    except ClientError as e:
        if e.response['Error']['Code'] == 'ResourceNotFoundException':
            print(f"Secret '{SECRET_NAME}' not found, skipping deletion.")
        else:
            print(f"Error deleting secret: {e}")
            raise

def main():
    try:
        create_secret()
        get_secret_value()

        print("\n--- Secrets Manager demonstration complete! ---")
        input("Press Enter to delete the secret...")

    except ClientError as e:
        print(f"An AWS client error occurred: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
    finally:
        delete_secret()
        print("\n--- Secrets Manager demonstration and cleanup complete ---")

if __name__ == "__main__":
    main()
