#!/bin/bash

# A script to create an AWS Glue Crawler, including necessary prerequisites,
# and then clean up all resources using AWS CLI.

# --- Configuration ---
REGION="us-east-1"
RANDOM_SUFFIX=$(head /dev/urandom | tr -dc a-z0-9 | head -c 8)
S3_BUCKET_NAME="my-cli-glue-data-${RANDOM_SUFFIX}"
GLUE_DATABASE_NAME="my_cli_glue_database"
GLUE_CRAWLER_NAME="MyCLIGlueCrawler"
IAM_ROLE_NAME="MyCLIGlueCrawlerRole"
SAMPLE_DATA_FILE="sample_data.csv"

# --- 1. Create S3 Bucket and Upload Sample Data ---
echo "--- Creating S3 Bucket: $S3_BUCKET_NAME ---"
aws s3api create-bucket \
  --bucket $S3_BUCKET_NAME \
  --region $REGION

echo "Uploading sample data to s3://$S3_BUCKET_NAME/input/$SAMPLE_DATA_FILE" ...
echo "id,name,value" > $SAMPLE_DATA_FILE
echo "1,Alice,100" >> $SAMPLE_DATA_FILE
echo "2,Bob,200" >> $SAMPLE_DATA_FILE

aws s3 cp $SAMPLE_DATA_FILE s3://$S3_BUCKET_NAME/input/$SAMPLE_DATA_FILE
rm $SAMPLE_DATA_FILE
echo "Sample data uploaded."

# --- 2. Create Glue Database ---
echo -e "\n--- Creating Glue Database: $GLUE_DATABASE_NAME ---"
aws glue create-database \
  --database-input "{\"Name\":\"$GLUE_DATABASE_NAME\"}" \
  --region $REGION

echo "Glue Database created."

# --- 3. Create IAM Role for Glue Crawler ---
echo -e "\n--- Creating IAM Role: $IAM_ROLE_NAME ---"
TRUST_POLICY_JSON=$(cat <<-EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "glue.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
)
GLUE_ROLE_ARN=$(aws iam create-role \
  --role-name $IAM_ROLE_NAME \
  --assume-role-policy-document "$TRUST_POLICY_JSON" \
  --query 'Role.Arn' --output text)

# Attach managed policy for Glue and S3 access
aws iam attach-role-policy \
  --role-name $IAM_ROLE_NAME \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole

aws iam attach-role-policy \
  --role-name $IAM_ROLE_NAME \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

echo "IAM Role created with ARN: $GLUE_ROLE_ARN"
echo "Waiting for IAM role to propagate..."
sleep 10

# --- 4. Create Glue Crawler ---
echo -e "\n--- Creating Glue Crawler: $GLUE_CRAWLER_NAME ---"
aws glue create-crawler \
  --name $GLUE_CRAWLER_NAME \
  --role $GLUE_ROLE_ARN \
  --database-name $GLUE_DATABASE_NAME \
  --targets "S3Targets=[{Path='s3://$S3_BUCKET_NAME/input/'}]" \
  --region $REGION

echo "Glue Crawler created."

# --- 5. Start Glue Crawler ---
echo -e "\n--- Starting Glue Crawler: $GLUE_CRAWLER_NAME ---"
aws glue start-crawler \
  --name $GLUE_CRAWLER_NAME \
  --region $REGION

echo "Waiting for crawler to complete..."
aws glue wait crawler-running \
  --name $GLUE_CRAWLER_NAME \
  --region $REGION
aws glue wait crawler-stopped \
  --name $GLUE_CRAWLER_NAME \
  --region $REGION

echo "Glue Crawler finished."

# --- 6. Output Table Name ---
TABLE_NAME=$(aws glue get-tables \
  --database-name $GLUE_DATABASE_NAME \
  --query 'TableList[0].Name' \
  --region $REGION \
  --output text)

echo -e "\n--- Glue Crawler Setup Complete! ---"
echo "Table created by crawler: $TABLE_NAME in database $GLUE_DATABASE_NAME"
echo "You can now query this table using Amazon Athena."

read -p "Press Enter to delete the Glue resources and S3 bucket..."

# --- Clean Up ---
echo -e "\n--- Cleaning up resources ---"

# Delete Glue Crawler
echo "Deleting Glue Crawler '$GLUE_CRAWLER_NAME'"...
aws glue delete-crawler \
  --name $GLUE_CRAWLER_NAME \
  --region $REGION

echo "Glue Crawler deleted."

# Delete Glue Table (if created)
if [ -n "$TABLE_NAME" ]; then
  echo "Deleting Glue Table '$TABLE_NAME'"...
  aws glue delete-table \
    --database-name $GLUE_DATABASE_NAME \
    --name $TABLE_NAME \
    --region $REGION
  echo "Glue Table deleted."
fi

# Delete Glue Database
echo "Deleting Glue Database '$GLUE_DATABASE_NAME'"...
aws glue delete-database \
  --name $GLUE_DATABASE_NAME \
  --region $REGION

echo "Glue Database deleted."

# Detach and Delete IAM Role
echo "Detaching policies from IAM Role '$IAM_ROLE_NAME'"...
aws iam detach-role-policy \
  --role-name $IAM_ROLE_NAME \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole \
  --region $REGION
aws iam detach-role-policy \
  --role-name $IAM_ROLE_NAME \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
  --region $REGION

echo "Deleting IAM Role '$IAM_ROLE_NAME'"...
aws iam delete-role \
  --role-name $IAM_ROLE_NAME \
  --region $REGION

echo "IAM Role deleted."

# Delete S3 Bucket
echo "Deleting S3 Bucket '$S3_BUCKET_NAME'"...
aws s3 rb s3://$S3_BUCKET_NAME --force --region $REGION

echo "S3 Bucket deleted."

echo -e "\n--- Glue Crawler demonstration and cleanup complete ---"
