#!/bin/bash

set -e

run_mysql () {
  {{ mysql_bin }} --defaults-file="{{ mysql_conf }}" --protocol=socket "$@"
}

revoke_user () {
  DB=$1
  UNAME=$2
  if [ ! -z "$UNAME" ]; then
    echo "Revoking all grants for user '$USER'";
    run_mysql -Be "
    set sql_log_bin=0;
    REVOKE ALL PRIVILEGES, GRANT OPTION FROM '$UNAME';
    DROP USER IF EXISTS '$UNAME'@'%';
    DROP USER IF EXISTS '$UNAME'@'localhost';
    DROP USER IF EXISTS '$UNAME'@'::';
    FLUSH PRIVILEGES;
    "
  fi
}

# Disable SQL_LOG_BIN, repman_slave_definition database doesn't need to be replicated

cat << EOF > {{ tmp_dir }}/.script.sql
SET @@SESSION.SQL_LOG_BIN=0;
use repman_slave_definition;

CREATE TABLE IF NOT EXISTS \`slave\` (
  \`name\` varchar(80) NOT NULL,
  \`state\` tinyint(1) DEFAULT NULL,
  \`user\` varchar(80) NOT NULL,
  PRIMARY KEY (\`name\`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

UPDATE \`slave\` set \`state\`=false;
{% for name, user in database_name_list -%}
{%  if name -%}
REPLACE INTO \`slave\` VALUES ('{{ name }}', true, '{{ user }}');
{%  endif -%}
{% endfor -%}

EOF

# Update requested slaves database
OUTPUT="{{ tmp_dir }}/removed_db.txt"
run_mysql < {{ tmp_dir }}/.script.sql
rm -f {{ tmp_dir }}/.script.sql
run_mysql -NBe "set sql_log_bin=0;SELECT name, user FROM repman_slave_definition.slave WHERE state=false" > $OUTPUT

DBNAME=$(run_mysql --skip-column-names -Be "set sql_log_bin=0;SELECT name FROM repman_slave_definition.slave WHERE state=false");
RET=$?

if [ ! "$RET" = "0" ]; then
  echo "Mysql command failed: $DBNAME"
  exit $RET
fi

if [ -z "$DBNAME" ]; then
  echo "No database for slave to remove.";
fi

for NAME in $DBNAME; do
  if [ ! -z "$NAME" ]; then
    USER=$(grep -oP "$NAME\s*\K\w+" $OUTPUT);
    if [ ! -z "$USER" ]; then
      revoke_user $NAME $USER;
    fi
    echo "Deleting database $NAME..."
    run_mysql -e "set sql_log_bin=0;DROP DATABASE IF EXISTS $NAME";
    run_mysql -e "set sql_log_bin=0;DELETE FROM repman_slave_definition.slave WHERE name='$NAME'";
    echo "Done."
  fi
done