set -e # Exit shell when an error is encountered

if [ "$2" = "" ] || [ "$1" = "-h" ]; then
  echo "Usage: `basename $0` SRC_URL TARGET_CONTAINER_NAME [DB_NAME (default=ram)]"
  exit 0
fi

# Config
SRC_URL=$1
TARGET_CONTAINER_NAME=$2
DB_NAME=${3:-"ram"}

echo "SRC_URL=$SRC_URL"
echo "TARGET_CONTAINER_NAME=$TARGET_CONTAINER_NAME"
echo "DB_NAME=$DB_NAME"

# Local variables
CWD=$PWD
TIMESTAMP=$(date +%Y%m%d%H%M%S)
BACKUP_DIR="backups/${TARGET_CONTAINER_NAME}_${DB_NAME}_${TIMESTAMP}"
DUMP_DIR="dump/$(echo $SRC_URL | sed -E 's/^\s*.*:\/\///g' | cut -f1 -d"/")_${TIMESTAMP}" # remove https:// and path from SRC_URL

if ! test -f .migrate; then
  echo "ERROR: .migrate file not found, check if you are in the right directory"
  exit 1
fi


# Backup of the target db
mkdir -p $BACKUP_DIR
docker exec $TARGET_CONTAINER_NAME mkdir -p /dump/$DB_NAME
docker exec $TARGET_CONTAINER_NAME bash -c "mongodump --authenticationDatabase admin --username root -d $DB_NAME --password \$MONGODB_ROOT_PASSWORD -h localhost"
docker cp $TARGET_CONTAINER_NAME:/dump/$DB_NAME $BACKUP_DIR
cp .migrate $BACKUP_DIR
echo "***** Db $TARGET_CONTAINER_NAME/$DB_NAME backed up in $BACKUP_DIR (with .migrate file)"


# Restore of the source backup
mkdir -p $DUMP_DIR
cd $DUMP_DIR
wget $SRC_URL/latest.tar.gz
wget $SRC_URL/.migrate
gunzip latest.tar.gz
tar -xvf latest.tar
docker exec $TARGET_CONTAINER_NAME rm -rf /dump/temp/
docker exec $TARGET_CONTAINER_NAME mkdir /dump/temp/
docker cp ./mongo__*/ram/ $TARGET_CONTAINER_NAME:/dump/temp/$DB_NAME
docker exec $TARGET_CONTAINER_NAME bash -c "mongo --authenticationDatabase admin --username root --password \$MONGODB_ROOT_PASSWORD $DB_NAME --eval 'db.dropDatabase()'"
docker exec $TARGET_CONTAINER_NAME bash -c "mongorestore --authenticationDatabase admin --username root --password \$MONGODB_ROOT_PASSWORD -d $DB_NAME /dump/temp/$DB_NAME/"
echo "***** Latest dump $SRC_URL restored in $TARGET_CONTAINER_NAME/$DB_NAME (and stored in $DUMP_DIR)"

# Cleanup user email and password change (not for admin users)
cat > mongo_clean_users.js <<EOL
db.users.aggregate([{ \$addFields: { emailTemp: { \$concat: [ {\$toLower: "\$name"}, ".", {\$toLower: "\$surname"}, "@nowhere69.com" ] } }}, { \$out: "users" }])
db.users.updateMany({role: {\$ne: 1}}, [{ \$set: { email: "\$emailTemp", password: { \$literal: "\$2a\$12\$vLQjJ9zAWyUwiXLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu" } } }])
db.users.updateMany({}, [{ \$unset: "emailTemp" }])
db.tempusers.deleteMany({})
db.newslettersubscriptions.deleteMany({})
EOL
docker cp ./mongo_clean_users.js $TARGET_CONTAINER_NAME:/dump/temp/
docker exec $TARGET_CONTAINER_NAME bash -c "mongo --authenticationDatabase admin --username root --password \$MONGODB_ROOT_PASSWORD $DB_NAME < /dump/temp/mongo_clean_users.js"
rm mongo_clean_users.js

# For local db, change user email
if [ "$TARGET_CONTAINER_NAME" = "resin-db" ]; then
  cat > mongo_rename_user.js <<EOL
db.users.updateMany({email: "inclusionnumerique@grandlyon.com"}, [{ \$set: { email: "admin@admin.com" } }])
db.users.updateMany({role: 1}, [{ \$set: { password: { \$literal: "\$2a\$12\$vLQjJ9zAWyUwiXLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu" } } }])
EOL
  docker cp ./mongo_rename_user.js $TARGET_CONTAINER_NAME:/dump/temp/
  docker exec $TARGET_CONTAINER_NAME bash -c "mongo --authenticationDatabase admin --username root --password \$MONGODB_ROOT_PASSWORD $DB_NAME < /dump/temp/mongo_rename_user.js"
  rm mongo_rename_user.js
fi

# .migrate file copy
cd $CWD
if [ "$DB_NAME" = "ram" ]; then 
  cp $DUMP_DIR/.migrate .migrate
  if [ "$TARGET_CONTAINER_NAME" = "resin-db" ]; then npm run migrate:up; fi
fi
docker exec $TARGET_CONTAINER_NAME rm -rf /dump/temp/

echo ""
echo "*************************************************************************** Summary *********************************************************************"
echo "Db $TARGET_CONTAINER_NAME/$DB_NAME backed up in $BACKUP_DIR (with .migrate file)"
echo "Latest dump $SRC_URL stored in $DUMP_DIR and restored in $TARGET_CONTAINER_NAME/$DB_NAME (and prod emails cleaned up)"
if [ "$DB_NAME" = "ram" ]; then echo "The local .migrate file has been copied from $SRC_URL for db $DB_NAME"; fi
if [ "$DB_NAME" = "ram" ]; then echo "Don't forget to reset elasticsearch indexes!!!"; fi
if [ "$DB_NAME" = "ram" ] && [ "$TARGET_CONTAINER_NAME" = "resin-db" ]; then echo "migration:up runned"; fi
echo "*********************************************************************************************************************************************************"

exit 0