var mysql = require('mysql2/promise');


export enum DEFAULT_MYSQL_QRY {
  DIS_FK_CHECK = 'SET FOREIGN_KEY_CHECKS = 0;',
  ENA_FK_CHECK = 'SET FOREIGN_KEY_CHECKS = 1;',
  TRUNCATE_TABLE = 'TRUNCATE TABLE :tableName;'
}

function getTruncateScriptForTables(tablesName: string[]) {
  return DEFAULT_MYSQL_QRY.DIS_FK_CHECK +
    tablesName.map(n => DEFAULT_MYSQL_QRY.TRUNCATE_TABLE.replace(':tableName', n)).join('\n') +
      DEFAULT_MYSQL_QRY.ENA_FK_CHECK;
}

function getScriptForPopulateTable(script: string) {
  return DEFAULT_MYSQL_QRY.DIS_FK_CHECK + '\n' +
            script + '\n' +
      DEFAULT_MYSQL_QRY.ENA_FK_CHECK;
}
export class Mysql {
  pool: any;

  constructor(conf: {user: string, password: string, host: string, database: string}) {
    const mysqlConf = {
      ...conf,
      multipleStatements: true,
      namedPlaceholders: true,
      waitForConnections: true,
      connectionLimit: 10,
      queueLimit: 0
    };
    this.pool = mysql.createPool(mysqlConf);
  }

  async resetTables(tableNames: string[]) {
    return await this.pool.query(getTruncateScriptForTables(tableNames));
  }

  async populateTable(sqlScript: string) {
    return await this.pool.query(getScriptForPopulateTable(sqlScript));
  }

  async executeCommand(script: string, parameters?: any) {
    return await this.pool.execute(script, parameters);
  }

  async query(script: string, parameters?: any) {
    return await this.pool.query(script, parameters);
  }
}

