#!/usr/bin/env python3
# Copyright Kani Contributors
# SPDX-License-Identifier: Apache-2.0 OR MIT

import argparse
import re
import sys
import subprocess
from subprocess import PIPE


EXIT_CODE_SUCCESS = 0
EXIT_CODE_MISMATCH = 1
EXIT_CODE_FAIL = 2


def get_version(tool_str):
    cmd = [tool_str, "--version"]
    try:
        version = subprocess.run(cmd, stdout=PIPE, stderr=PIPE, check=True,
                                 universal_newlines=True)
    except (OSError, subprocess.SubprocessError) as error:
        print(error)
        print(f"Can't run command '{' '.join(cmd)}'")
        sys.exit(EXIT_CODE_FAIL)

    match = re.match("([0-9]+).([0-9]+).([0-9]+)", version.stdout)
    if not match:
        print(f"Can't parse " + tool_str + " version string: '{version.stdout.strip()}'")
        sys.exit(EXIT_CODE_FAIL)

    return match.groups()

def complete_version(*version):
    numbers = [int(num) if num else 0 for num in version]
    return (numbers + [0, 0, 0])[:3]

def main():
    parser = argparse.ArgumentParser(
        description='Check CBMC version matches major/minor/patch')
    parser.add_argument('--major', required=True)
    parser.add_argument('--minor', required=True)
    parser.add_argument('--patch')
    args = parser.parse_args()

    current_cbmc_version = complete_version(*get_version("cbmc"))
    current_synthesizer_version = complete_version(*get_version("goto-synthesizer"))
    desired_version = complete_version(args.major, args.minor, args.patch)

    if desired_version > current_cbmc_version:
        version_string = '.'.join([str(num) for num in current_cbmc_version])
        desired_version_string = '.'.join([str(num) for num in desired_version])
        print(f'ERROR: CBMC version is {version_string}, expected at least {desired_version_string}')
        sys.exit(EXIT_CODE_MISMATCH)

    if current_cbmc_version != current_synthesizer_version:
        version_string = '.'.join([str(num) for num in current_synthesizer_version])
        cbmc_version_string = '.'.join([str(num) for num in current_cbmc_version])
        print(
            f'ERROR: goto-synthesizer version is {version_string}, non consistent with CBMC version {cbmc_version_string}')
        sys.exit(EXIT_CODE_MISMATCH)


if __name__ == "__main__":
    main()