#!/bin/bash

# Generate raw_subnets.txt if missing
if [[ ! -f raw_subnets.txt ]]; then
  echo "raw_subnets.txt not found. Generating it..."
  aws ec2 describe-subnets \
  --subnet-ids subnet-00dcd4d7661ed1dca subnet-0d77de6a28faf3b1b subnet-089c4fac3ce023a31 subnet-0f04247c272f5c5c0 subnet-0d34201a75122aefb subnet-0e71e56abc65a72be subnet-0b999af4840400918 subnet-0f8287ce548c29340 subnet-052202d959671b78b subnet-0fd9d885dbb3339b3 \
  --query 'Subnets[*].[SubnetId, Tags[?Key==`Name`].Value | [0]]' \
  --output text --profile DBaaS-DevUser-Role-219248915861 > raw_subnets.txt
fi

# Generate raw_instances.txt if missing
if [[ ! -f raw_instances.txt ]]; then
  echo "raw_instances.txt not found. Generating it..."
  aws ec2 describe-instances \
  --filters 'Name=subnet-id,Values=[subnet-00dcd4d7661ed1dca,subnet-0d77de6a28faf3b1b,subnet-089c4fac3ce023a31,subnet-0f04247c272f5c5c0,subnet-0d34201a75122aefb,subnet-0e71e56abc65a72be,subnet-0b999af4840400918,subnet-0f8287ce548c29340,subnet-052202d959671b78b,subnet-0fd9d885dbb3339b3]' \
  --query 'Reservations[*].Instances[*].[SubnetId, PrivateIpAddress, PublicIpAddress, Tags[?Key==`Name`].Value | [0]]' \
  --output text --profile DBaaS-DevUser-Role-219248915861 > raw_instances.txt
fi

# Extract bastion host details
bastion_hosts=$(grep -i "bastion" raw_instances.txt)

# Read and sort subnets by name
subnet_data=$(sort -k2 raw_subnets.txt)

# Process instances and group by subnet
output=""
while IFS= read -r subnet; do
  subnet_id=$(echo "$subnet" | awk '{print $1}')
  subnet_name=$(echo "$subnet" | awk '{print $2}')
  output+="Subnet: $subnet_id, $subnet_name\n"
  
  # Extract bastion for public subnets
  if [[ "$subnet_name" == *Public* ]]; then
    bastion_in_subnet=$(echo "$bastion_hosts" | grep "$subnet_id" | awk '{print "Bastion: " $4 " " $3 " " $2}')
    if [[ -n "$bastion_in_subnet" ]]; then
      output+="$bastion_in_subnet\n"
    fi
  fi
  
  # Extract and sort instances for this subnet
  instances=$(grep "^$subnet_id" raw_instances.txt | awk '{print $2 " " $3 " " $4}' | sort -k3,3)

  # Separate instances into roles
  pd_instances=$(echo "$instances" | grep -i "PD" | sed 's/^/PD: /')
  tidb_instances=$(echo "$instances" | grep -i "TiDB" | sed 's/^/TiDB: /')
  tikv_instances=$(echo "$instances" | grep -i "TiKV" | sed 's/^/TiKV: /')
  tiflash_instances=$(echo "$instances" | grep -i "TiFlash" | sed 's/^/TiFlash: /')

  # Add instances to output
  [[ -n "$pd_instances" ]] && output+="$pd_instances\n"
  [[ -n "$tidb_instances" ]] && output+="$tidb_instances\n"
  [[ -n "$tikv_instances" ]] && output+="$tikv_instances\n"
  [[ -n "$tiflash_instances" ]] && output+="$tiflash_instances\n"

  output+="\n"
done <<< "$subnet_data"

# Save to output file and display
echo -e "$output" > formatted_output.txt
cat formatted_output.txt