import json
from pathlib import Path

p = Path(__file__).parent
red_b, red_c, b, c = [json.loads((p / name).read_text()) for name in ('frozen-red-B.json', 'frozen-red-C.json', 'green-B.json', 'green-C.json')]
def cases(report):
    assert all(x['method'] == 'POST' for x in report['cases'])
    return {(x['method'], x['path'], x['input_label']): x for x in report['cases']}
def queries(report, scenario):
    return [x['fingerprint'] for x in report['events'] if x['kind'] == 'query_observed' and x['scenario'] == scenario]

for report in (red_b, red_c, b, c):
    assert report['case_count'] == 82 and report['error'] is None
    assert report['cleanup'] == {'token_absent': True, 'full_natural_table_unchanged': True, 'framework_dml_observed': 0, 'fixture_db_rows_created': 0}
rb, rc, gb, gc = map(cases, (red_b, red_c, b, c))
assert set(rb) == set(rc) == set(gb) == set(gc)
red_differences = []
for key in gb:
    x, y = gb[key], gc[key]
    assert x['complete_wire_sha_without_trace'] == rb[key]['complete_wire_sha_without_trace'], ('MySQL wire regression', key)
    assert queries(b, x['scenario']) == queries(red_b, rb[key]['scenario']), ('MySQL SQL regression', key)
    assert x['raw_json_shape'] == y['raw_json_shape'], ('Wire shape mismatch', key)
    assert x['complete_wire_sha_without_trace'] == y['complete_wire_sha_without_trace'], ('Complete wire value/type/order mismatch', key)
    if key[2] == 'NULL':
        assert x['business_status'] == y['business_status'] == 500
    else:
        assert x['http_status'] == y['http_status'] == 200
        assert x['business_status'] == y['business_status'] == 200
        assert x['full_source_projection_equal'] and y['full_source_projection_equal']
        assert x['projected_source_sha'] == y['projected_source_sha']
        assert x['source_error'] is None and y['source_error'] is None
    if rb[key]['complete_wire_sha_without_trace'] != rc[key]['complete_wire_sha_without_trace']:
        red_differences.append({'method': key[0], 'path': key[1], 'input_label': key[2]})
assert red_differences
print(json.dumps({'passed': True, 'unique_post_routes': 2, 'cases_per_engine': 82, 'positive_enum_type_scenarios_per_engine': 34, 'complete_wire_equal': 82, 'original_mysql_wire_and_sql_unchanged': 82, 'original_dm_differences_closed': len(red_differences), 'red_difference_labels': red_differences}, indent=2))
