"""Run one disposable SQLite fixture and compare it with handwritten results."""
import argparse
import hashlib
import json
from pathlib import Path
import sqlite3
import sys

folder = Path(__file__).resolve().parent
expected_bytes = (folder / 'expected.json').read_bytes()
expected = json.loads(expected_bytes)
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('case', choices=list(expected['cases']))
args = parser.parse_args()

mutations = {
    'baseline': '',
    'add_c7': "INSERT INTO checks VALUES ('C7', 'P2', 'pass');",
    'remove_c5_c6': "DELETE FROM checks WHERE check_id IN ('C5', 'C6');",
    'empty_checks': 'DELETE FROM checks;',
}
with sqlite3.connect(':memory:') as connection:
    connection.executescript((folder / 'schema-seed.sql').read_text())
    if mutations[args.case]:
        connection.execute(mutations[args.case])
    results = {}
    for name in ['diagnostic', 'wrong', 'correct']:
        cursor = connection.execute((folder / (name + '.sql')).read_text())
        columns = [entry[0] for entry in cursor.description]
        rows = [list(row) for row in cursor.fetchall()]
        expected_columns = expected['diagnostic_columns' if name == 'diagnostic' else 'aggregate_columns']
        results[name] = {
            'columns': columns,
            'rows': rows,
            'matches_hand_expected': columns == expected_columns and rows == expected['cases'][args.case][name],
        }
    report = {
        'case': args.case,
        'python_version': sys.version,
        'sqlite_version': connection.execute('SELECT sqlite_version()').fetchone()[0],
        'database': ':memory:; freshly seeded for this process',
        'mutation': mutations[args.case],
        'expected_sha256_before_execution': hashlib.sha256(expected_bytes).hexdigest(),
        'results': results,
    }
print(json.dumps(report, indent=2))
raise SystemExit(0 if all(item['matches_hand_expected'] for item in results.values()) else 1)
