#
# Cookbook Name:: mariadb
# Provider:: replication
#

# rubocop:disable Metrics/BlockLength

use_inline_resources if defined?(use_inline_resources)

def whyrun_supported?
  true
end

def get_mysql_command(host, port, user, password)
  mysql_command = '/usr/bin/mysql'
  mysql_command += ' -h ' + host unless host.nil?
  mysql_command += ' -P ' + port unless port.nil?
  mysql_command += ' -u ' + user unless user.nil?
  mysql_command += ' -p' + password unless password.nil?
  mysql_command
end

action :add do
  if new_resource.master_host.nil? || new_resource.master_user.nil? ||
      new_resource.master_password.nil?
    raise '[ERROR] When adding a slave, you have to define master_host' \
         ' master_user and master_password !'
  end
  sql_string = 'CHANGE MASTER '
  sql_string += '\'' + new_resource.name + '\' ' if new_resource.name != 'default'
  sql_string += 'TO '
  sql_string += 'MASTER_HOST=\'' + new_resource.master_host + '\', '
  sql_string += 'MASTER_PORT=' + new_resource.master_port.to_s + ', ' unless new_resource.master_port.nil?
  sql_string += 'MASTER_USER=\'' + new_resource.master_user + '\', '
  sql_string += 'MASTER_PASSWORD=\'' + new_resource.master_password + '\''
  if new_resource.master_use_gtid == 'no'
    # Use non GTID replication setup
    if new_resource.master_log_file.nil? || new_resource.master_log_pos.nil?
      raise '[ERROR] When adding a slave without GTID, you have to' \
           'define master_log_file and master_log_pos !'
    end
    unless new_resource.master_log_file.nil?
      sql_string += ', MASTER_LOG_FILE=\'' + \
        new_resource.master_log_file + '\''
      sql_string += ', MASTER_LOG_POS=' + new_resource.master_log_pos.to_s
    end
  else
    # Use GTID replication
    sql_string += ', MASTER_USE_GTID=' + new_resource.master_use_gtid + ';'
  end
  execute 'add_replication_from_master_' + new_resource.name do
    # Add sensitive true when foodcritic #233 fixed
    command '/bin/echo "' + sql_string + '" | ' + get_mysql_command(
      new_resource.host,
      new_resource.port,
      new_resource.user,
      new_resource.password
    )
    action :run
  end
end

action :remove do
  execute 'remove_replication_from_master_' + new_resource.name do
    # Add sensitive true when foodcritic #233 fixed
    command '/bin/echo "STOP SLAVE \'' + new_resource.name + '\'; ' \
      'RESET SLAVE \'' + new_resource.name + '\' ALL' \
      ';" | ' + get_mysql_command(
        new_resource.host,
        new_resource.port,
        new_resource.user,
        new_resource.password
      )
  end
end

action :start do
  command_master_connection = ' \'' + new_resource.name + '\'' unless new_resource.name == 'default'
  execute 'start_replication_from_master_' + new_resource.name do
    # Add sensitive true when foodcritic #233 fixed
    command '/bin/echo "START SLAVE' + command_master_connection + ';' \
      '" | ' + get_mysql_command(
        new_resource.host,
        new_resource.port,
        new_resource.user,
        new_resource.password
      )
  end
end

action :stop do
  command_master_connection = ' \'' + new_resource.name + '\'' unless new_resource.name == 'default'
  execute 'start_replication_from_master_' + new_resource.name do
    # Add sensitive true when foodcritic #233 fixed
    command '/bin/echo "STOP SLAVE' + command_master_connection + ';' \
      '" | ' + get_mysql_command(
        new_resource.host,
        new_resource.port,
        new_resource.user,
        new_resource.password
      )
  end
end
