#!/bin/bash

# Example: ./00-prepare-node-roles-for-user.sh <user_name_tag_assigned_by_instructor> <instructor_name_tag>

# Setup ENV
source ~/cloud-env.sh

case ${REGION_CODE} in
    "us-east-1")
        REGION_NAME="virginia"
        ;;
    "us-east-2")
        REGION_NAME="ohio"
        ;;
    "us-west-2")
        REGION_NAME="oregon"
        ;;
esac

REGION_CODE1=us-east-1
REGION_CODE2=us-east-2
REGION_CODE3=us-west-2
REGION_NAME1=virginia
REGION_NAME2=ohio
REGION_NAME3=oregon

rm -f ~/mysql80-community-release-el9-1.noarch.rpm

echo export REGION_NAME=${REGION_NAME} >> ~/cloud-env.sh

# Enter the classroom username such as "user2" assigned by the instructor. 
export USER=${1}
# The instructor's name tag shared by your instructor.
export TRAINER=${2}

# Node 1
HOST_R1PD1_REGION=${REGION_CODE1}
HOST_R1PD1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME1}-pd1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE1}`

HOST_R1PD1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME1}-pd1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE1}`

# Node 2
HOST_R2PD1_REGION=${REGION_CODE2}
HOST_R2PD1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME2}-pd1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE2}`

HOST_R2PD1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME2}-pd1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE2}`

# Node 3
HOST_R3PD1_REGION=${REGION_CODE3}
HOST_R3PD1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME3}-pd1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE3}`

HOST_R3PD1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME3}-pd1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE3}`

# Node 4
HOST_R1KV1_REGION=${REGION_CODE1}
HOST_R1KV1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME1}-kv1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE1}`

HOST_R1KV1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME1}-kv1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE1}`

# Node 5
HOST_R2KV1_REGION=${REGION_CODE2}
HOST_R2KV1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME2}-kv1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE2}`

HOST_R2KV1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME2}-kv1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE2}`

# Node 6
HOST_R3KV1_REGION=${REGION_CODE3}
HOST_R3KV1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME3}-kv1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE3}`

HOST_R3KV1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME3}-kv1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE3}`

# Node 7
HOST_R1DB1_REGION=${REGION_CODE1}
HOST_R1DB1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME1}-db1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE1}`

HOST_R1DB1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME1}-db1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE1}`

# Node 8
HOST_R2DB1_REGION=${REGION_CODE2}
HOST_R2DB1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME2}-db1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE2}`

HOST_R2DB1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME2}-db1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE2}`

# Node 10
HOST_R1APP1_REGION=${REGION_CODE1}
HOST_R1APP1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME1}-app1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE1}`

HOST_R1APP1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME1}-app1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE1}`

# Node 11
HOST_R2APP1_REGION=${REGION_CODE2}
HOST_R2APP1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME2}-app1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE2}`

HOST_R2APP1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME2}-app1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE2}`

# Node 12
HOST_R3MONITOR1_REGION=${REGION_CODE3}
HOST_R3MONITOR1_PRIVATE_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME3}-monitor1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PrivateIpAddress" \
--output text \
--region ${REGION_CODE3}`

HOST_R3MONITOR1_PUBLIC_IP=`aws ec2 describe-instances \
--filter "Name=instance-state-name,Values=running" "Name=tag:student,Values=${USER}" "Name=tag:role,Values=${REGION_NAME3}-monitor1" "Name=tag:trainer,Values=${TRAINER}" \
--query "Reservations[0].Instances[0].PublicIpAddress" \
--output text \
--region ${REGION_CODE3}`

echo export HOST_R1APP1_PRIVATE_IP=${HOST_R1APP1_PRIVATE_IP} > ./hosts-env.sh
echo export HOST_R1APP1_PUBLIC_IP=${HOST_R1APP1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R1APP1_REGION=${HOST_R1APP1_REGION} >> ./hosts-env.sh

echo export HOST_R2APP1_PRIVATE_IP=${HOST_R2APP1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R2APP1_PUBLIC_IP=${HOST_R2APP1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R2APP1_REGION=${HOST_R2APP1_REGION} >> ./hosts-env.sh

echo export HOST_R3MONITOR1_PRIVATE_IP=${HOST_R3MONITOR1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R3MONITOR1_PUBLIC_IP=${HOST_R3MONITOR1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R3MONITOR1_REGION=${HOST_R3MONITOR1_REGION} >> ./hosts-env.sh

echo export HOST_R1PD1_PRIVATE_IP=${HOST_R1PD1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R1PD1_PUBLIC_IP=${HOST_R1PD1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R1PD1_REGION=${HOST_R1PD1_REGION} >> ./hosts-env.sh

echo export HOST_R2PD1_PRIVATE_IP=${HOST_R2PD1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R2PD1_PUBLIC_IP=${HOST_R2PD1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R2PD1_REGION=${HOST_R2PD1_REGION} >> ./hosts-env.sh

echo export HOST_R3PD1_PRIVATE_IP=${HOST_R3PD1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R3PD1_PUBLIC_IP=${HOST_R3PD1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R3PD1_REGION=${HOST_R3PD1_REGION} >> ./hosts-env.sh

echo export HOST_R1DB1_PRIVATE_IP=${HOST_R1DB1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R1DB1_PUBLIC_IP=${HOST_R1DB1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R1DB1_REGION=${HOST_R1DB1_REGION} >> ./hosts-env.sh

echo export HOST_R2DB1_PRIVATE_IP=${HOST_R2DB1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R2DB1_PUBLIC_IP=${HOST_R2DB1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R2DB1_REGION=${HOST_R2DB1_REGION} >> ./hosts-env.sh

echo export HOST_R1KV1_PRIVATE_IP=${HOST_R1KV1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R1KV1_PUBLIC_IP=${HOST_R1KV1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R1KV1_REGION=${HOST_R1KV1_REGION} >> ./hosts-env.sh

echo export HOST_R2KV1_PRIVATE_IP=${HOST_R2KV1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R2KV1_PUBLIC_IP=${HOST_R2KV1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R2KV1_REGION=${HOST_R2KV1_REGION} >> ./hosts-env.sh

echo export HOST_R3KV1_PRIVATE_IP=${HOST_R3KV1_PRIVATE_IP} >> ./hosts-env.sh
echo export HOST_R3KV1_PUBLIC_IP=${HOST_R3KV1_PUBLIC_IP} >> ./hosts-env.sh
echo export HOST_R3KV1_REGION=${HOST_R3KV1_REGION} >> ./hosts-env.sh

echo export R1_NAME=${REGION_NAME1} >> ./hosts-env.sh
echo export R2_NAME=${REGION_NAME2} >> ./hosts-env.sh
echo export R3_NAME=${REGION_NAME3} >> ./hosts-env.sh

source ./hosts-env.sh

echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R1PD1_PUBLIC_IP} > ./ssh-to-us-east-1-pd.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R2PD1_PUBLIC_IP} > ./ssh-to-us-east-2-pd.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R3PD1_PUBLIC_IP} > ./ssh-to-us-west-2-pd.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R1DB1_PUBLIC_IP} > ./ssh-to-us-east-1-db.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R2DB1_PUBLIC_IP} > ./ssh-to-us-east-2-db.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R1APP1_PUBLIC_IP} > ./ssh-to-us-east-1-app.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R2APP1_PUBLIC_IP} > ./ssh-to-us-east-2-app.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R3MONITOR1_PUBLIC_IP} > ./ssh-to-us-west-2-monitor.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R1KV1_PUBLIC_IP} > ./ssh-to-us-east-1-kv.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R2KV1_PUBLIC_IP} > ./ssh-to-us-east-2-kv.sh
echo ssh -i ~/.ssh/pe-class-key-oregon.pem ${HOST_R3KV1_PUBLIC_IP} > ./ssh-to-us-west-2-kv.sh
chmod +x ./*.sh

# Setup 11 Nodes TiDB Cluster Topology
cp ./template-topology.yaml ./topology.yaml
sed -i '' \
  -e "s/<HOST_R1PD1_PUBLIC_IP>/${HOST_R1PD1_PUBLIC_IP}/g" \
  -e "s/<HOST_R2PD1_PUBLIC_IP>/${HOST_R2PD1_PUBLIC_IP}/g" \
  -e "s/<HOST_R3PD1_PUBLIC_IP>/${HOST_R3PD1_PUBLIC_IP}/g" \
  -e "s/<HOST_R1KV1_PUBLIC_IP>/${HOST_R1KV1_PUBLIC_IP}/g" \
  -e "s/<HOST_R2KV1_PUBLIC_IP>/${HOST_R2KV1_PUBLIC_IP}/g" \
  -e "s/<HOST_R3KV1_PUBLIC_IP>/${HOST_R3KV1_PUBLIC_IP}/g" \
  -e "s/<HOST_R1DB1_PUBLIC_IP>/${HOST_R1DB1_PUBLIC_IP}/g" \
  -e "s/<HOST_R2DB1_PUBLIC_IP>/${HOST_R2DB1_PUBLIC_IP}/g" \
  -e "s/<REGION_NAME1>/${REGION_NAME1}/g" \
  -e "s/<REGION_NAME2>/${REGION_NAME2}/g" \
  -e "s/<REGION_NAME3>/${REGION_NAME3}/g" \
  -e "s/<HOST_R3MONITOR1_PUBLIC_IP>/${HOST_R3MONITOR1_PUBLIC_IP}/g" \
  ./topology.yaml 2>/dev/null

# Setup lightning-csv.toml
# cp ./template-lightning-csv.toml ./lightning-csv.toml
# sed -i '' \
#   -e "s/<HOST_R2PD1_PUBLIC_IP>/${HOST_R2PD1_PUBLIC_IP}/g" \
#   -e "s/<HOST_R2DB1_PUBLIC_IP>/${HOST_R2DB1_PUBLIC_IP}/g" \
#   ./lightning-csv.toml 2>/dev/null

# Copy hosts-env.sh to user home. It's also a safe operation if the PWD is user home. 
cp ./hosts-env.sh ~/hosts-env.sh 2>>/dev/null

echo
echo "11 nodes are prepared for user ${TRAINER}."
