#!/usr/bin/env python
# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
import argparse
import subprocess

ROOT_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))


def protoc_path(out_directory):
  path = os.path.join(out_directory, 'gcc_like_host', 'protoc')
  assert os.path.isfile(path)
  return path


def call(cmd, *args):
  path = os.path.join('tools', cmd)
  command = [path] + list(args)
  try:
    subprocess.check_call([path] + list(args), cwd=ROOT_DIR)
  except subprocess.CalledProcessError as e:
    assert False, 'Command: {} failed'.format(' '.join(command))


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('OUT')
  args = parser.parse_args()
  out = args.OUT

  try:
    assert os.path.isdir(out), \
        'Output directory "{}" is not a directory'.format(out)
    call('fix_include_guards')
    call('gen_android_bp')
    call('gen_merged_protos')
    call('gen_binary_descriptors', '--protoc', protoc_path(out))
    call('gen_tracing_cpp_headers_from_protos', out)

  except AssertionError as e:
    if not str(e):
      raise
    print('Error: {}'.format(e))
    return 1

  return 0

if __name__ == '__main__':
  exit(main())
