import boto3
from botocore.exceptions import ClientError
import time

# A script to demonstrate basic SQS message operations (create, send, receive, delete)
# on a Standard SQS queue using Boto3.

# --- Configuration ---
REGION = "us-east-1"
QUEUE_NAME = "MyBoto3SQSQueue"

sqs_client = boto3.client('sqs', region_name=REGION)

def create_sqs_queue():
    """Creates a Standard SQS queue."""
    print(f"--- Creating SQS Queue: {QUEUE_NAME} ---")
    try:
        response = sqs_client.create_queue(
            QueueName=QUEUE_NAME,
            Attributes={
                'DelaySeconds': '0',
                'MessageRetentionPeriod': '345600', # 4 days
                'VisibilityTimeout': '30'
            }
        )
        queue_url = response['QueueUrl']
        print(f"Queue created with URL: {queue_url}")
        print("Waiting for queue to be ready...")
        time.sleep(5) # Give SQS a moment to provision the queue
        return queue_url
    except ClientError as e:
        if e.response['Error']['Code'] == 'QueueAlreadyExists':
            print(f"Queue {QUEUE_NAME} already exists. Fetching URL.")
            return sqs_client.get_queue_url(QueueName=QUEUE_NAME)['QueueUrl']
        else:
            raise e

def send_message(queue_url, message_body):
    """Sends a message to the SQS queue."""
    print(f"\n--- Sending a message to the queue ---")
    sqs_client.send_message(
        QueueUrl=queue_url,
        MessageBody=message_body
    )
    print(f"Message sent: '{message_body}'")

def receive_and_delete_message(queue_url):
    """Receives and deletes a message from the SQS queue."""
    print(f"\n--- Receiving messages from the queue (using long polling) ---")
    response = sqs_client.receive_message(
        QueueUrl=queue_url,
        MaxNumberOfMessages=1,
        WaitTimeSeconds=10 # Enable long polling
    )

    messages = response.get('Messages', [])
    if messages:
        message = messages[0]
        message_body_received = message['Body']
        receipt_handle = message['ReceiptHandle']

        print(f"Received message: '{message_body_received}'")
        print(f"Receipt Handle: '{receipt_handle}'")

        print(f"\n--- Deleting the received message ---")
        sqs_client.delete_message(
            QueueUrl=queue_url,
            ReceiptHandle=receipt_handle
        )
        print("Message deleted.")
    else:
        print("No messages received within the wait time.")

def delete_sqs_queue(queue_url):
    """Deletes the SQS queue."""
    print(f"\n--- Deleting SQS Queue: {QUEUE_NAME} ---")
    sqs_client.delete_queue(QueueUrl=queue_url)
    print(f"Queue {QUEUE_NAME} deleted successfully.")

def main():
    message_body = "Hello from Boto3 SQS!"
    
    try:
        queue_url = create_sqs_queue()
        send_message(queue_url, message_body)
        receive_and_delete_message(queue_url)
        delete_sqs_queue(queue_url)
        print("\n--- SQS message operations demonstration complete ---")
    except ClientError as e:
        print(f"An AWS client error occurred: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

if __name__ == "__main__":
    main()
