#!/bin/bash

# A script to create a simple EMR cluster using AWS CLI.

# --- Configuration ---
REGION="us-east-1"
CLUSTER_NAME="MyCLIEmerCluster"
EMR_SERVICE_ROLE_NAME="EMR_DefaultRole_CLI"
EMR_EC2_INSTANCE_PROFILE_NAME="EMR_EC2_DefaultRole_CLI"
LOG_BUCKET_NAME="my-cli-emr-logs-$(aws sts get-caller-identity --query Account --output text | tr -d '\n')-$REGION"

# --- 1. Create IAM Roles ---
echo "--- Creating IAM Roles for EMR ---"

# EMR Service Role
echo "Creating EMR Service Role: $EMR_SERVICE_ROLE_NAME..."
TRUST_POLICY_EMR=$(cat <<-"EOF"
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "elasticmapreduce.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
)
EMR_SERVICE_ROLE_ARN=$(aws iam create-role \
  --role-name $EMR_SERVICE_ROLE_NAME \
  --assume-role-policy-document "$TRUST_POLICY_EMR" \
  --query 'Role.Arn' --output text)
aws iam attach-role-policy \
  --role-name $EMR_SERVICE_ROLE_NAME \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEMRServicePolicy_v2

echo "EMR Service Role ARN: $EMR_SERVICE_ROLE_ARN"

# EMR EC2 Instance Profile Role
echo "Creating EMR EC2 Instance Profile Role: $EMR_EC2_INSTANCE_PROFILE_NAME..."
TRUST_POLICY_EC2=$(cat <<-"EOF"
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "ec2.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
)
EMR_EC2_ROLE_ARN=$(aws iam create-role \
  --role-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --assume-role-policy-document "$TRUST_POLICY_EC2" \
  --query 'Role.Arn' --output text)
aws iam attach-role-policy \
  --role-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2forEMRRole # This is a common policy, but for EMR, AmazonEC2forEMRRole is more appropriate. Let's use that.
aws iam attach-role-policy \
  --role-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess # For simplicity, grant S3 access for logs and data

# Create instance profile
INSTANCE_PROFILE_ARN=$(aws iam create-instance-profile \
  --instance-profile-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --query 'InstanceProfile.Arn' --output text)
aws iam add-role-to-instance-profile \
  --instance-profile-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --role-name $EMR_EC2_INSTANCE_PROFILE_NAME

echo "EMR EC2 Instance Profile ARN: $INSTANCE_PROFILE_ARN"
echo "Waiting for IAM roles to propagate..."
sleep 15

# --- 2. Create S3 Bucket for EMR Logs ---
echo -e "\n--- Creating S3 Bucket for EMR Logs: $LOG_BUCKET_NAME ---"
aws s3api create-bucket \
  --bucket $LOG_BUCKET_NAME \
  --region $REGION

echo "S3 Bucket created."

# --- 3. Create EMR Cluster ---
echo -e "\n--- Creating EMR Cluster: $CLUSTER_NAME ---"
aws emr create-cluster \
  --name $CLUSTER_NAME \
  --release-label emr-6.12.0 \
  --applications Name=Spark Name=Hadoop \
  --ec2-attributes KeyName=your-ec2-keypair,InstanceProfile=$EMR_EC2_INSTANCE_PROFILE_NAME \
  --service-role $EMR_SERVICE_ROLE_NAME \
  --log-uri s3://$LOG_BUCKET_NAME/ \
  --instance-groups \
    InstanceGroupType=MASTER,InstanceType=m5.xlarge,InstanceCount=1 \
    InstanceGroupType=CORE,InstanceType=m5.xlarge,InstanceCount=1 \
  --tags Key=Name,Value=$CLUSTER_NAME \
  --region $REGION

echo "EMR cluster '$CLUSTER_NAME' created. Waiting for it to be in a waiting state (ready for jobs)..."
CLUSTER_ID=$(aws emr list-clusters --query "Clusters[?Name=='$CLUSTER_NAME' && Status.State=='WAITING'].Id" --output text)
aws emr wait cluster-waiting \
  --cluster-id $CLUSTER_ID \
  --region $REGION

CLUSTER_ID=$(aws emr list-clusters --query "Clusters[?Name=='$CLUSTER_NAME'].Id" --output text)

echo -e "\n--- EMR Cluster Created Successfully! ---"
echo "Cluster ID: $CLUSTER_ID"
echo "You can now submit jobs to this cluster."

read -p "Press Enter to terminate the EMR cluster and clean up resources..."

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

# Terminate EMR Cluster
echo "Terminating EMR cluster '$CLUSTER_ID' நான்குக"
aws emr terminate-clusters \
  --cluster-ids $CLUSTER_ID \
  --region $REGION

echo "Waiting for EMR cluster to be terminated..."
aws emr wait cluster-terminated \
  --cluster-id $CLUSTER_ID \
  --region $REGION

echo "EMR cluster terminated."

# Delete S3 Bucket for EMR Logs
echo "Deleting S3 Bucket '$LOG_BUCKET_NAME'..."
aws s3 rb s3://$LOG_BUCKET_NAME --force --region $REGION

echo "S3 Bucket deleted."

# Detach and Delete IAM Roles
echo "Detaching policies from IAM Role '$EMR_SERVICE_ROLE_NAME'..."
aws iam detach-role-policy \
  --role-name $EMR_SERVICE_ROLE_NAME \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEMRServicePolicy_v2 \
  --region $REGION
echo "Deleting IAM Role '$EMR_SERVICE_ROLE_NAME'..."
aws iam delete-role \
  --role-name $EMR_SERVICE_ROLE_NAME \
  --region $REGION

echo "Detaching policies from IAM Role '$EMR_EC2_INSTANCE_PROFILE_NAME'..."
aws iam detach-role-policy \
  --role-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2forEMRRole \
  --region $REGION
aws iam detach-role-policy \
  --role-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess \
  --region $REGION

echo "Removing role from instance profile '$EMR_EC2_INSTANCE_PROFILE_NAME'..."
aws iam remove-role-from-instance-profile \
  --instance-profile-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --role-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --region $REGION

echo "Deleting instance profile '$EMR_EC2_INSTANCE_PROFILE_NAME'..."
aws iam delete-instance-profile \
  --instance-profile-name $EMR_EC2_INSTANCE_PROFILE_NAME \
  --region $REGION

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

echo "IAM Roles deleted."

echo -e "\n--- EMR cluster demonstration and cleanup complete ---"
