import argparse
import os
import sys

from subprocess import call, check_call, CalledProcessError
from time import sleep
from typing import List, Tuple


def main():
    settings, rest = parse_arguments()
    cmake_opts = ['-D' + cmd for cmd in settings.D]
    if settings.wait:
        wait()
    if settings.build_llvm or settings.build_llvm_only:
        build_llvm(cmake_opts)
    if settings.build_llvm_only:
        return
    sys.exit(test(rest))


def wait():
    # It is an easy on CPU way of keeping the docker container running
    # while the user has a terminal session in that container.
    while True:
        sleep(3600)


def parse_arguments() -> Tuple[argparse.Namespace, List[str]]:
    parser = argparse.ArgumentParser()
    parser.add_argument('--wait', action='store_true')
    parser.add_argument('--build-llvm', action='store_true')
    parser.add_argument('--build-llvm-only', action='store_true')
    parser.add_argument('-D', action='append', default=[])
    return parser.parse_known_args()


def build_llvm(cmake_options):
    os.chdir('/build')
    try:
        if is_cmake_needed():
            cmake(cmake_options)
        ninja()
    except CalledProcessError:
        print("Build failed!")
        sys.exit(1)


def is_cmake_needed():
    return "build.ninja" not in os.listdir()


CMAKE_COMMAND = "cmake -G Ninja -DCMAKE_BUILD_TYPE=Release " \
    "-DCMAKE_INSTALL_PREFIX=/analyzer -DLLVM_TARGETS_TO_BUILD=X86 " \
    "-DLLVM_ENABLE_PROJECTS=\"clang;openmp\" -DLLVM_BUILD_RUNTIME=OFF " \
    "-DLLVM_ENABLE_TERMINFO=OFF -DCLANG_ENABLE_ARCMT=OFF " \
    "-DCLANG_ENABLE_STATIC_ANALYZER=ON"


def cmake(cmake_options):
    check_call(CMAKE_COMMAND + ' '.join(cmake_options) + ' /llvm-project/llvm',
            shell=True)


def ninja():
    check_call("ninja install", shell=True)


def test(args: List[str]) -> int:
    os.chdir("/projects")
    return call("/scripts/SATest.py " + " ".join(args), shell=True)


if __name__ == '__main__':
    main()
