# vim: set sw=4 sts=4 ts=4 sw=99 et:
from contextlib import contextmanager
import argparse
import json
import os
import platform
import shutil
import subprocess

@contextmanager
def Chdir(path):
    old = os.getcwd()
    os.chdir(path)
    print('> cd {} # {}'.format(path, os.getcwd()))
    try:
        yield
    finally:
        os.chdir(old)

def run_shell(argv, env = None):
    if type(argv) is str:
        print('> {}'.format(argv))
        shell = True
    else:
        print('> {}'.format(' '.join(argv)))
        shell = False
    try:
        output = subprocess.check_output(argv, stderr = subprocess.STDOUT, env = env, shell = shell)
    except subprocess.CalledProcessError as cpe:
        if not shell:
            print(cpe.output.decode('utf-8', 'ignore'))
        raise
    print(output.decode('utf-8', 'ignore'))

def output_needs_cleaning():
    if not os.path.isdir('OUTPUT'):
        return False
    amb2_dir = os.path.join('OUTPUT', '.ambuild2')
    if not os.path.exists(os.path.join(amb2_dir, 'graph')):
        return True
    if not os.path.exists(os.path.join(amb2_dir, 'vars')):
        return True
    return False

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--config', type = str, required = True,
                        help = 'Buildbot slave name')
    parser.add_argument('--hl2sdk-root', type = str, required = True,
                        help = 'hl2sdk collection')
    parser.add_argument('--python-cmd', type = str, required = True,
                        default = 'python3',
                        help = 'Python command')
    args = parser.parse_args()

    run_shell("git submodule update --init --recursive")

    source = os.getcwd()

    with open(os.path.join('support', 'buildbot', 'buildconfig.json'), 'rt') as fp:
        config_root = json.load(fp)

    config = config_root.get(args.config, {})

    # Set build properties.
    build_env = os.environ.copy()
    for env_var in ['CC', 'CXX']:
        if env_var not in config:
            continue
        build_env[env_var] = config[env_var]

    if platform.system() == 'Windows':
        hl2sdk_root = '/Volumes/hgshare'
        python_cmd = "C:\\Python38\\Python.exe"
    elif platform.system() == 'Linux':
        hl2sdk_root = '/hgshare'
        python_cmd = "python3"
    elif platform.system() == 'Windows':
        hl2sdk_root = 'H:\\'
        python_cmd = "python3"

    config_argv = [
        args.python_cmd,
        os.path.join(source, 'configure.py'),
        '--enable-optimize',
        '--breakpad-dump',
        '--no-color',
        '--symbol-files',
        '--targets=x86,x86_64',
        '--sdks=all',
        '--out=OUTPUT',
        '--hl2sdk-root={}'.format(args.hl2sdk_root),
    ]

    print("Attempting to reconfigure...")

    with Chdir('..'):
        if output_needs_cleaning():
            shutil.rmtree('OUTPUT')
        if not os.path.isdir('OUTPUT'):
            os.makedirs('OUTPUT')
        run_shell(config_argv, env = build_env)

if __name__ == '__main__':
    main()
