#!/usr/bin/env python
# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""Builds the AppRTC collider using the golang toolchain.

The golang toolchain is downloaded by download_apprtc.py. We use that here
to build the AppRTC collider server.

This script needs to know the path to the 'src' directory in apprtc, the
root directory of 'go' and the output_dir.
"""

import fileinput
import os
import shutil
import subprocess
import sys

import utils

USAGE_STR = "Usage: {} <apprtc_dir> <go_dir> <output_dir>"


def _ConfigureApprtcServerToDeveloperMode(app_yaml_path):
  for line in fileinput.input(app_yaml_path, inplace=True):
    # We can't click past these in browser-based tests, so disable them.
    line = line.replace('BYPASS_JOIN_CONFIRMATION: false',
                        'BYPASS_JOIN_CONFIRMATION: true')
    sys.stdout.write(line)


def main(argv):
  if len(argv) != 4:
    print(USAGE_STR.format(argv[0]))

  apprtc_dir = os.path.abspath(argv[1])
  go_root_dir = os.path.abspath(argv[2])
  golang_workspace = os.path.abspath(argv[3])

  app_yaml_path = os.path.join(apprtc_dir, 'out', 'app_engine', 'app.yaml')
  _ConfigureApprtcServerToDeveloperMode(app_yaml_path)

  utils.RemoveDirectory(golang_workspace)

  collider_dir = os.path.join(apprtc_dir, 'src', 'collider')
  shutil.copytree(collider_dir, os.path.join(golang_workspace, 'src'))

  golang_path = os.path.join(go_root_dir, 'bin',
                             'go' + utils.GetExecutableExtension())
  golang_env = os.environ.copy()
  golang_env['GOROOT'] = go_root_dir
  golang_env['GOPATH'] = golang_workspace
  golang_env['GO111MODULE'] = 'off'
  collider_out = os.path.join(golang_workspace,
                              'collidermain' + utils.GetExecutableExtension())
  subprocess.check_call(
      [golang_path, 'build', '-o', collider_out, 'collidermain'],
      env=golang_env)


if __name__ == '__main__':
  sys.exit(main(sys.argv))
