"""Clone schema only into a unique disposable DB; never write to the app DB."""
import os
from pathlib import Path
import subprocess
import time
import secrets

root = Path(__file__).resolve().parent.parent
mysql = r'C:\xampp\mysql\bin\mysql.exe'
dump = r'C:\xampp\mysql\bin\mysqldump.exe'
common = ['--protocol=tcp', '--host=127.0.0.1', '--port=3306', '--user=root']
schema = 'tourapp_majority_test_' + str(time.time_ns())
test_user = 'majority_test_' + str(time.time_ns())
test_password = secrets.token_hex(24)
assert schema.startswith('tourapp_majority_test_') and schema.replace('_', '').isalnum()

def query(sql):
    return subprocess.run([mysql, *common, '--batch', '--skip-column-names'], input=sql.encode(), check=True, capture_output=True).stdout

def app_checksums():
    names = query('SHOW TABLES FROM tourist_grouping_db').decode().splitlines()
    tables = ','.join('`tourist_grouping_db`.`'+name+'`' for name in names)
    return query('CHECKSUM TABLE '+tables+' EXTENDED')

before = app_checksums()
created = False
created_accounts = []
try:
    query('CREATE DATABASE `'+schema+'` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci')
    created = True
    definitions = subprocess.run([dump, *common, '--no-data', '--skip-add-drop-table', 'tourist_grouping_db'], check=True, capture_output=True).stdout
    subprocess.run([mysql, *common, schema], input=definitions, check=True, capture_output=True)
    for host in ['localhost', '127.0.0.1']:
        query("CREATE USER '"+test_user+"'@'"+host+"' IDENTIFIED BY '"+test_password+"'")
        created_accounts.append(host)
        query("GRANT SELECT, INSERT, UPDATE, DELETE ON `"+schema+"`.* TO '"+test_user+"'@'"+host+"'")
    env = os.environ.copy()
    env.update(TRAVELIN_MAJORITY_TEST_DB_NAME=schema,
               TRAVELIN_MAJORITY_TEST_DB_HOST='127.0.0.1',
               TRAVELIN_MAJORITY_TEST_DB_PORT='3306',
               TRAVELIN_MAJORITY_TEST_DB_USER=test_user,
               TRAVELIN_MAJORITY_TEST_DB_PASSWORD=test_password)
    result = subprocess.run([r'C:\src\flutter\bin\flutter.bat', 'test', 'test/server/absolute_majority_database_test.dart', '--reporter', 'expanded'], cwd=root, env=env, capture_output=True)
    (root/'work/absolute_majority_database_tests.log').write_bytes(result.stdout+result.stderr)
    print((result.stdout+result.stderr).decode('utf-8', errors='replace'))
    exit_code = result.returncode
finally:
    for host in created_accounts:
        query("DROP USER '"+test_user+"'@'"+host+"'")
    if created:
        # Only the exact unique schema created above can be dropped.
        query('DROP DATABASE `'+schema+'`')
        print('Disposable majority test schema removed.')
    assert before == app_checksums(), 'Application DB checksum changed during tests.'
    print('Application DB checksum unchanged across all 33 tables.')
raise SystemExit(exit_code)
