#!/usr/bin/python3

import os
import subprocess
import sys

ninja = sys.argv[1]

def call(cmd):
  subprocess.check_call(cmd, shell=True)

def append(path, line):
  with open(path, 'a') as f:
    print >>f, line

print("Hello from {platform} in {cwd}!".format(platform=sys.platform,
                                               cwd=os.getcwd()))

if 'darwin' in sys.platform:
  # Get Xcode from CIPD using mac_toolchain tool.
  mac_toolchain = os.path.join(os.getcwd(), sys.argv[3])
  xcode_app_path = os.path.join(os.getcwd(), sys.argv[4])
  # See mapping of Xcode version to Xcode build version here:
  # https://chrome-infra-packages.appspot.com/p/infra_internal/ios/xcode/mac/+/
  XCODE_BUILD_VERSION = '16a242d'   # xcode 16.0
  # When updating Xcode to a different version, it might be necessary to delete any existing
  # installations with a line such as:
  #     call('rm -rf {xcode_app_path}'.format(xcode_app_path=xcode_app_path))
  call(('{mac_toolchain}/mac_toolchain install '
        '-kind mac '
        '-xcode-version {xcode_build_version} '
        '-output-dir {xcode_app_path}').format(
            mac_toolchain=mac_toolchain,
            xcode_build_version=XCODE_BUILD_VERSION,
            xcode_app_path=xcode_app_path))
  call('sudo xcode-select -switch {xcode_app_path}'.format(
      xcode_app_path=xcode_app_path))

  call('{ninja}/ninja -C skcms -k 0'.format(ninja=ninja))

elif 'linux' in sys.platform:
  # Point to clang in our clang_linux package.
  clang_linux = os.path.realpath(sys.argv[3])
  append('skcms/ninja/clang', 'cc  = {}/bin/clang  '.format(clang_linux))
  append('skcms/ninja/clang', 'cxx = {}/bin/clang++'.format(clang_linux))

  # Get an Emscripten environment all set up.
  call('git clone https://github.com/emscripten-core/emsdk.git')
  os.chdir('emsdk')
  call('./emsdk install 3.1.72')
  call('./emsdk install node-20.18.0-64bit')
  os.chdir('..')

  emscripten_sdk = os.path.realpath('emsdk')
  node = emscripten_sdk + '/node/20.18.0_64bit/bin/node'

  em_config = os.path.realpath(os.path.join('.', 'em_config'))
  with open(em_config, 'w') as f:
    print >>f, '''
LLVM_ROOT = '{}/upstream/bin'
BINARYEN_ROOT = '{}/upstream'
EMSCRIPTEN_ROOT = '{}/upstream/emscripten'
NODE_JS = '{}'
COMPILER_ENGINE = NODE_JS
JS_ENGINES = [NODE_JS]
  '''.format(emscripten_sdk, emscripten_sdk, emscripten_sdk, node)

  append('skcms/ninja/emscripten',
         'cc  = env EM_CONFIG={} {}/upstream/emscripten/emcc'.format(
           em_config, emscripten_sdk))
  append('skcms/ninja/emscripten',
         'cxx = env EM_CONFIG={} {}/upstream/emscripten/em++'.format(
           em_config, emscripten_sdk))
  append('skcms/ninja/emscripten',
         'node = {}'.format(node))

  call('{ninja}/ninja -C skcms -k 0'.format(ninja=ninja))

else:  # Windows
  win_toolchain = os.path.realpath(sys.argv[2])
  msvc = win_toolchain + '\\VC\\Tools\\MSVC\\14.24.28314\\'
  sdk  = win_toolchain + '\\win_sdk\\'

  os.environ['PATH'] = msvc + 'bin\\HostX64\\x64;' + os.environ['PATH']
  os.environ['INCLUDE'] = msvc + 'include;'
  os.environ['INCLUDE'] += sdk + 'Include\\10.0.17763.0\\shared;'
  os.environ['INCLUDE'] += sdk + 'Include\\10.0.17763.0\\ucrt;'
  os.environ['INCLUDE'] += sdk + 'Include\\10.0.17763.0\\um;'
  os.environ['LIB'] = msvc + 'lib\\x64;'
  os.environ['LIB'] += sdk + 'Lib\\10.0.17763.0\\um\\x64;'
  os.environ['LIB'] += sdk + 'Lib\\10.0.17763.0\\ucrt\\x64;'

  call('{ninja}\\ninja.exe -C skcms -f msvs.ninja -k 0'.format(ninja=ninja))
