#!/bin/bash

AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION:-us-east-1}"
ECR_REPOSITORY="${ECR_REPOSITORY:-086679231553.dkr.ecr.us-east-1.amazonaws.com/db-deploy}"
KAFKA_DB_DEPLOY_ECR_REPOSITORY="${KAFKA_DB_DEPLOY_ECR_REPOSITORY:-086679231553.dkr.ecr.us-east-1.amazonaws.com/kafka-db-deploy}"
ECR_REPOSITORY_TAG="${ECR_REPOSITORY_TAG:-latest}"
FORCE_NEO4J_KAFKA_LOCK_RELEASE="${FORCE_NEO4J_KAFKA_LOCK_RELEASE:-false}"
SINK_CONTINUE_ON_DLQ="${SINK_CONTINUE_ON_DLQ:-false}"
SNOWFLAKE_BATCH_SIZE_FOR_KAFKA_DB_DEPLOY="${SNOWFLAKE_BATCH_SIZE_FOR_KAFKA_DB_DEPLOY:-5000}"

ghprbActualCommit=$(git rev-parse HEAD)
masterCommit=$(git rev-parse HEAD~1)
echo "Checking revision ${ghprbActualCommit} against ${masterCommit}"

allChangedFiles="$(git diff-tree --no-commit-id --name-only -r ${ghprbActualCommit} ${masterCommit})"
echo "Changed files are ${allChangedFiles}"
changedFile="$(git diff-tree --no-commit-id --name-only -r ${ghprbActualCommit} ${masterCommit}| grep -v /pom.xml | grep -E '(*.xml|*.sql|*.cypher)')"
echo "Changed migration files are ${changedFile}"

# Get warehouse name
IFS='/' read -r warehousename remaining <<< "$changedFile"

# Get an ECR login and pull the latest image
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 086679231553.dkr.ecr.us-east-1.amazonaws.com

if [[ ${warehousename} == 'neo4j-kafka' ]]; then
  echo "This warehouse is deprecated"
elif [[ ${warehousename} == 'kafka-db-deploy' ]]; then
  docker pull ${KAFKA_DB_DEPLOY_ECR_REPOSITORY}:${ECR_REPOSITORY_TAG}
else
  docker pull ${ECR_REPOSITORY}:${ECR_REPOSITORY_TAG}
fi

# Inject liquibase command
liquibasecmd="liquibase:${type}"
rollbackcount=""
if [ $type = 'rollback' ]; then
  rollbackcount="-Dliquibase.rollbackCount=1"
fi

if [ ${warehousename} = 'snowflake' ]; then
  IFS='/' read -r dummy dbname remaining <<< "$changedFile"

  echo "Database is snowflake/${dbname}"

  echo "Downloading Snowflake key and properties from S3..."
  aws s3 cp s3://nickelback/db-deploy/${ENV}/snowflake/${dbname}/db.properties ${warehousename}/${dbname}/build/
  aws s3 cp s3://nickelback/db-deploy/${ENV}/snowflake/${dbname}/rsa_key.p8 ${warehousename}/${dbname}/build/

  # inject AWS keys
  tools/bash/inject_variables.sh $changedFile -v AWS_ACCESS_KEY_ID "${AWS_ACCESS_KEY_ID}" -v AWS_SECRET_ACCESS_KEY "${AWS_SECRET_ACCESS_KEY}"

  # inject schemaname in lowercase when needed
  LOWER_ENV=$(echo $ENV | tr '[:upper:]' '[:lower:]')
  tools/bash/inject_variables.sh $changedFile -v SCHEMA_NAME_LOWER "$LOWER_ENV"

  # inject schema
  UPPERENV=$(echo $ENV | tr '[:lower:]' '[:upper:]')
  tools/bash/inject_variables.sh $changedFile -v SCHEMA_NAME "$UPPERENV"

  # inject S3 bucket
  if [ -z ${S3_BUCKET+x} ]; then
  	S3_BUCKET=''
  fi
  tools/bash/inject_variables.sh $changedFile -v S3_BUCKET "$S3_BUCKET"

  docker run \
    -i \
    -v ${WORKSPACE}:/src/db \
    -e JAVA_OPTS='-Dnet.snowflake.jdbc.enableBouncyCastle=true' \
    -w=/src/db \
    ${ECR_REPOSITORY}:${ECR_REPOSITORY_TAG} \
      mvn \
        -f ${warehousename}/${dbname}/build/pom.xml \
        initialize ${liquibasecmd} \
        -DchangeLogFile=/src/db/$changedFile \
        ${rollbackcount}

elif [ ${warehousename} = 'delphi' ]; then
  IFS='/' read -r dummy dbname remaining <<< "$changedFile"

  echo "Deprecated database path is detected: delphi/${dbname}. Please use snowflake/${dbname} instead."
  exit 1

elif [ ${warehousename} = 'neo4j' ]; then
  IFS='/' read -r dummy dbname remaining <<< "$changedFile"

  echo "Database is Neo4J: ${dbname}"

  aws s3 cp s3://nickelback/db-deploy/${ENV}/neo4j/${dbname}/db.properties $warehousename/${dbname}/build/

  changedFile=$(basename -- "$changedFile")
  echo "Changed file name: ${changedFile}"

  docker run -i -v ${WORKSPACE}/${warehousename}/${dbname}:/src/db -w=/src/db ${ECR_REPOSITORY}:${ECR_REPOSITORY_TAG} mvn -f build/pom.xml initialize ${liquibasecmd} -DchangeLogFile=$changedFile ${rollbackcount}
elif [ ${warehousename} = 'neo4j-aura' ]; then
  IFS='/' read -r dummy dbname remaining <<< "$changedFile"

  echo "Database is Neo4J-Aura: ${dbname}"
  aws s3 cp s3://nickelback/db-deploy/${ENV}/neo4j-aura/${dbname}/db.properties $warehousename/${dbname}/build/

  changedFile=$(basename -- "$changedFile")
  echo "Changed file name: ${changedFile}"

  docker run -i -v ${WORKSPACE}/${warehousename}/${dbname}:/src/db -w=/src/db ${ECR_REPOSITORY}:${ECR_REPOSITORY_TAG} mvn -q -f build/pom.xml initialize package -DchangeLogFile=$changedFile

elif [ ${warehousename} = 'neo4j-kafka' ]; then

  echo "Going forward please use 'kafka-db-deploy' directory for your DB PR files"
  echo "README: https://github.com/theorchard/database/blob/master/kafka-db-deploy/README.md"

  exit 1

elif [ ${warehousename} = 'kafka-db-deploy' ]; then
  IFS='/' read -r skip flow_name skip <<< "$changedFile"
  echo "Flow name is: ${flow_name}"

  if [ ${flow_name} = 'snowflake-mysql' ]; then
    IFS='/' read -r skip skip mysql_db_name skip <<< "$changedFile"
    echo "Mysql destination DB name is: ${mysql_db_name}"
  fi

  changedFileName=$(basename -- "$changedFile")
  echo "Changed file name: ${changedFileName}"

  # inject schema
  UPPERENV=$(echo $ENV | tr '[:lower:]' '[:upper:]')
  tools/bash/inject_variables.sh $changedFile -v SCHEMA_NAME "$UPPERENV"

  LOWER_ENV=$(echo $ENV | tr '[:upper:]' '[:lower:]')

  echo "Cleaning up docker container id file..."
  rm -f /tmp/docker_db_deploy.cid
  # comma seperated list of all roles this user can assume to get kafka broker details on other aws accounts.
  OTHER_ROLES_FOR_CLUSTER_ACCESS="arn:aws:iam::591204808501:role/qa-kafka-db-deploy-role,arn:aws:iam::285943604611:role/qa-kafka-db-deploy-role"
  if [ ${UPPERENV} = 'PROD' ]; then
      OTHER_ROLES_FOR_CLUSTER_ACCESS="arn:aws:iam::031099521156:role/prod-kafka-db-deploy-role,arn:aws:iam::737325105821:role/prod-kafka-db-deploy-role"
  fi

  docker run --rm -i --sig-proxy=true \
      --cidfile /tmp/docker_db_deploy.cid \
      -e "Environment=${LOWER_ENV}" \
      -e "FLOW_NAME"=${flow_name} \
      -e "MYSQL_DB_NAME"=${mysql_db_name} \
      -e "FORCE_NEO4J_KAFKA_LOCK_RELEASE=${FORCE_NEO4J_KAFKA_LOCK_RELEASE}" \
      -e "SNOWFLAKE_BATCH_SIZE=${SNOWFLAKE_BATCH_SIZE_FOR_KAFKA_DB_DEPLOY}" \
      -e "CONTINUE_ON_DLQ=${SINK_CONTINUE_ON_DLQ}" \
      -e "CONNECTOR_BATCH_SIZE=${SINK_BATCH_SIZE_FOR_KAFKA_DB_DEPLOY}" \
      -e "LOG_LEVEL=DEBUG" \
      -e "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" \
      -e "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" \
      -e "OTHER_ROLES_FOR_CLUSTER_ACCESS=${OTHER_ROLES_FOR_CLUSTER_ACCESS}" \
      ${KAFKA_DB_DEPLOY_ECR_REPOSITORY}:${ECR_REPOSITORY_TAG} < $changedFile
else
  IFS='/' read -r dbname remaining <<< "$changedFile"

  echo "Database is ${dbname}"

  aws s3 cp s3://nickelback/db-deploy/${ENV}/${dbname}/db.properties ${dbname}/build/

  docker run -i -v ${WORKSPACE}:/src/db -w=/src/db ${ECR_REPOSITORY}:${ECR_REPOSITORY_TAG} mvn -f ${dbname}/build/pom.xml initialize ${liquibasecmd} -DchangeLogFile=/src/db/$changedFile ${rollbackcount}
fi
