const mysql = require('mysql2/promise');

const args = process.argv.slice(2);
const user = args[0];
const port = args[1];
const dbName  = args[2];

async function createTable() {
    const conn = await getConnection();
    try {
        await conn.execute("create table users (name varchar(20))");
    } catch (err) {
        console.error(`Error creating table:`, err);
        process.exit(1);
    } finally {
        conn.end();
    }
}

async function commitTable() {
    const conn = await getConnection();
    try {
        await conn.execute(`call dolt_add('.')`);
        await conn.execute(`call dolt_commit('-am', 'new table')`);
    } catch (err) {
        console.error(`Error committing table:`, err);
    } finally {
        conn.end();
    }
}

const authors = [
    'bob', 'john', 'mary', 'alice',
    'bob2', 'john2', 'mary2', 'alice2',
    'bob3', 'john3', 'mary3', 'alice3',
    'bob4', 'john4', 'mary4', 'alice4',
    'bob5', 'john5', 'mary5', 'alice5',
    'bob6', 'john6', 'mary6', 'alice6',
    'bob7', 'john7', 'mary7', 'alice7',
    'bob8', 'john8', 'mary8', 'alice8',
    'bob9', 'john9', 'mary9', 'alice9'
];


async function insertAuthor(name) {
    const conn = await getConnection();
    try {
        await conn.execute('start transaction');
        await conn.execute('INSERT INTO users (name) VALUES(?);', [name]);
        await conn.execute(`call dolt_commit('-am', concat('created author', ?))`, [name]);
    } catch (err) {
        console.error(`Error committing ${name}:`, err);
        process.exit(1)
    } finally {
        conn.end();
    }
}

async function validateCommits(name) {
    const conn = await getConnection();
    var results;
    try {
        results = await conn.query(`select count(*) as c from dolt_log where message like 'created author%'`);
    } catch (err) {
        console.error(`Error:`, err);
        process.exit(1)
    } finally {
        conn.end();
    }
    
    const count = results[0][0].c;
    const expectedCount = authors.length;
    if (count != expectedCount) {
        console.error(`Unexpected number of commits: expected ${expectedCount}, was ${count}`);
        process.exit(1)
    }
}

async function getConnection() {
    const connection = await mysql.createConnection({
        host: '127.0.0.1',
        port: port,
        user: user,
        database: dbName,
    });
    return connection;
}

// Regression test concurrent dolt_commit with node clients
// https://github.com/dolthub/dolt/issues/4361
async function main() {
    await createTable();
    await commitTable();
    await Promise.all(authors.map(insertAuthor));
    await validateCommits();
}

main();
