#!/bin/bash

TEMPFILE=awsSecretToUpload.json

echo "Enter the number for the secret you'd like to update

1 - cypress.env.json
2 - user-data
"

read -r INPUT

case $INPUT in
1)
  FILENAME=cypress.env.json
  FILEPATH=
  SECRET_PATH="qa/cypress-configs/$FILENAME"
  DOWNLOAD_LOCALLY=true
  ;;

2)
  FILENAME=user-data.json
  FILEPATH=cypress/fixtures/

  # Get list of applications from e2e directory (excluding specified directories)
  echo "Available applications:"
  APP_DIRS=($(ls cypress/e2e | grep -v -E '^(production|testFeatures|performance|handbook|qa)$'))

  for i in "${!APP_DIRS[@]}"; do
    echo "$((i+1)) - ${APP_DIRS[i]}"
  done

  echo "Select an application:"
  read -r APP_INPUT

  # Validate application selection
  if [[ $APP_INPUT -lt 1 || $APP_INPUT -gt ${#APP_DIRS[@]} ]]; then
    echo 'Error: Invalid application selection, exiting...'
    exit 1
  fi

  SELECTED_APP=${APP_DIRS[$((APP_INPUT-1))]}
  echo "Selected application: $SELECTED_APP"

  # Select environment
  echo "
Select application environment:
1 - qa
2 - prod"
  read -r ENV_INPUT

  case $ENV_INPUT in
  1)
    CONFIG_ENV="qa"
    ;;
  2)
    CONFIG_ENV="prod"
    ;;
  *)
    echo 'Error: Invalid environment selection, exiting...'
    exit 1
    ;;
  esac

  echo "Selected application environment: $CONFIG_ENV"

  # Convert application name to lowercase using tr command
  SELECTED_APP_LOWER=$(echo "$SELECTED_APP" | tr '[:upper:]' '[:lower:]')

  # Set the secret path for user data
  SECRET_PATH="$CONFIG_ENV/e2e-test-secrets/user-data/$SELECTED_APP_LOWER-user-data"
  # Update the filename display to show the actual secret name
  FILENAME="$SELECTED_APP_LOWER-user-data"
  # Don't download locally for user-data flow
  DOWNLOAD_LOCALLY=false
  ;;

*)
  echo 'Error invalid input, exiting...'
  exit 1
  ;;
esac

echo "Selected $FILENAME downloading file from secrets manager"
echo "Secret path: $SECRET_PATH"

aws secretsmanager get-secret-value --secret-id "$SECRET_PATH" --region us-east-1 --query SecretString --output text >$TEMPFILE

CURTIME=$(date +%s)

echo "$FILENAME downloaded as $TEMPFILE please make your changes in your IDE and continue y/n"

validate_changes() {
  read -r CHOICE

  case $CHOICE in
  y | Y)
    FILETIME=$(stat -t %s -f %m $TEMPFILE)
    TIMEDIFF=$(expr $CURTIME - $FILETIME)
    if [ $TIMEDIFF -ge 0 ]; then
      echo 'File changes not saved, please make and save your changes and continue y/n'
      validate_changes
    else
      echo 'Validating JSON'
      node scripts/validateJson.js $TEMPFILE
      if [ $? -eq 1 ]; then
        echo 'json invalid, please fix and continue y/n'
        validate_changes
      fi
    fi

    ;;
  n | N)
    echo "Exiting script and removing temporary file"
    rm $TEMPFILE
    exit 0
    ;;
  *)
    echo "Error invalid input, exiting..."
    exit 1
    ;;
  esac
}

validate_changes

SECRET=$(cat $TEMPFILE)

aws secretsmanager put-secret-value --secret-id "$SECRET_PATH" --region us-east-1 --secret-string "$SECRET" --output text >/dev/null

echo "Secret $FILENAME successfully updated, refreshing from AWS"

rm $TEMPFILE

# Only download locally if it's the cypress.env.json flow
if [ "$DOWNLOAD_LOCALLY" = true ]; then
  aws secretsmanager get-secret-value --secret-id "$SECRET_PATH" --region us-east-1 --query SecretString --output text >$FILEPATH$FILENAME
  echo "Updated $FILENAME saved locally to $FILEPATH$FILENAME"
else
  echo "Secret updated in AWS Secrets Manager"
fi
