#!/usr/bin/python3

import argparse
import subprocess
import json
import os
import sys
import tempfile

'''
This script generates a json test case. It accepts a test_case_request as input through standard input.

{
    "boot": {
        "type": "qemu"
    },
    "compose-request": {
        "distro": "fedora-30",
        "arch": "x86_64",
        "image-type": "qcow2",
        "filename": "disk.qcow2",
        "blueprint": {}
    }
}

It then outputs a json test case as standard output. 
'''


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 run_osbuild(manifest, store, output):
    subprocess.run(["osbuild",
                    "--store", store,
                    "--output-directory", output,
                    "--json", "-"],
                   check=True,
                   encoding="utf-8",
                   input=json.dumps(manifest))


def main(test_case, store):
    boot_type = test_case["boot"]["type"]
    compose_request = json.dumps(test_case["compose-request"])

    pipeline_command = ["go", "run", "./cmd/osbuild-pipeline", "-"]
    test_case["manifest"] = json.loads(get_subprocess_stdout(pipeline_command, input=compose_request, encoding="utf-8"))

    pipeline_command = ["go", "run", "./cmd/osbuild-pipeline", "-rpmmd", "-"]
    test_case["rpmmd"] = json.loads(get_subprocess_stdout(pipeline_command, input=compose_request, encoding="utf-8"))

    if boot_type != "nspawn-extract":
        with tempfile.TemporaryDirectory(dir=store, prefix="test-case-output-") as output:
            run_osbuild(test_case["manifest"], store, output)
            image_file = os.path.join(output, test_case["compose-request"]["filename"])
            test_case["image-info"] = json.loads(get_subprocess_stdout(["tools/image-info", image_file], encoding="utf-8"))

    return test_case


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="Generate test cases")
    parser.add_argument("store", metavar="DIRECTORY", type=os.path.abspath, help="path to the osbuild store")
    args = parser.parse_args()
    test_case_request = json.load(sys.stdin)
    test_case = main(test_case_request, args.store)
    sys.stdout.write(json.dumps(test_case))
    sys.exit()
