#!/bin/bash

# This script creates a database then builds and checks tables using MySQL
# Shell in both SQL and Python modes.

set -e

TEST_DB_NAME="testdb"
TEST_TABLE_NAME="testtable"

# Create a new mysql database to test against.
setup_database() {
    mysql -e "CREATE DATABASE $TEST_DB_NAME;"
}

# Run a SQL command against the test database using MySQL Shell.
run_mysql_shell_sql_cmd() {
    local sql_command=$1
    mysqlsh  --socket=/var/run/mysqld/mysqld.sock --no-password --sql -D "$TEST_DB_NAME" -e "$sql_command" 2>/dev/null
}

# Run a Python command against the test database using MySQL Shell.
run_mysql_shell_python_cmd() {
    local python_command=$1
    mysqlsh  --socket=/var/run/mysqld/mysqld.sock --no-password --python -D "$TEST_DB_NAME" -e "$python_command" 2>/dev/null
}

setup_database

# Add some test data to the table.
run_mysql_shell_sql_cmd "CREATE TABLE $TEST_TABLE_NAME (name VARCHAR(255), num INT, date DATE);"
run_mysql_shell_sql_cmd "INSERT INTO $TEST_TABLE_NAME (name, num, date) VALUES ('test1', 42, '2023-10-14');"
run_mysql_shell_sql_cmd "INSERT INTO $TEST_TABLE_NAME (name, num, date) VALUES ('test2', 26, '2028-04-27');"

# Test data contained in table ignoring spaces.
TEST_SQL_OUTPUT=$(echo $(run_mysql_shell_sql_cmd "SELECT * FROM $TEST_TABLE_NAME;"))
EXPECTED_SQL_OUTPUT="name num date test1 42 2023-10-14 test2 26 2028-04-27"

if [ "$EXPECTED_SQL_OUTPUT" != "$TEST_SQL_OUTPUT" ]; then
    echo "Error: MySQL Shell SQL mode returned wrong data, expected:"
    echo $EXPECTED_SQL_OUTPUT
    echo "found:"
    echo $TEST_SQL_OUTPUT
    exit 1
fi

# Test data contained in Python output.
run_mysql_shell_python_cmd "util.export_table('testtable', 'tableoutput')"
TEST_PYTHON_OUTPUT=$(echo $(cat tableoutput))
EXPECTED_PYTHON_OUTPUT="test1 42 2023-10-14 test2 26 2028-04-27"

if [ "$EXPECTED_PYTHON_OUTPUT" != "$TEST_PYTHON_OUTPUT" ]; then
    echo "Error: MySQL Shell Python mode returned wrong data, expected:"
    echo $EXPECTED_PYTHON_OUTPUT
    echo "found:"
    echo $TEST_PYTHON_OUTPUT
    exit 1
fi
