#!/usr/bin/python3

import argparse
import subprocess
import json
import os
import sys

def get_subprocess_stdout(*args, **kwargs):
    sp = subprocess.run(*args, **kwargs, stdout=subprocess.PIPE)
    if sp.returncode != 0:
        sys.stderr.write(sp.stdout)
        sys.exit(1)
    
    return sp.stdout

def main(distro, arch, store, output):
    with open("tools/test-case-generators/format-request-map.json") as format_request_json:
        format_request_dict = json.load(format_request_json)
    with open("tools/test-case-generators/repos.json") as repos_json:
        repos_dict = json.load(repos_json)
    for output_format, test_case_request in format_request_dict.items():
        test_case_request["compose-request"]["distro"] = distro
        test_case_request["compose-request"]["arch"] = arch
        test_case_request["compose-request"]["repositories"] = repos_dict[distro][arch]
        test_case = json.loads(get_subprocess_stdout(["tools/test-case-generators/generate-test-case", store], input=json.dumps(test_case_request), encoding="utf-8"))
        name = distro.replace("-", "_") + "-" + arch + "-" + output_format.replace("-", "_") + "-boot.json"
        file_name = output + "/" + name
        with open(file_name, 'w') as case_file:
            json.dump(test_case, case_file, indent=2)
    return

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Generate test cases")
    parser.add_argument("--distro", help="distribution for test cases", required=True)
    parser.add_argument("--arch", help="architecture for test cases", required=True)
    parser.add_argument("--store", metavar="STORE_DIRECTORY", type=os.path.abspath, help="path to the osbuild store", required=True)
    parser.add_argument("--output", metavar="OUTPUT_DIRECTORY", type=os.path.abspath, help="path to the output directory", required=True)
    args = parser.parse_args()

    main(args.distro, args.arch, args.store, args.output)
    sys.exit()
