#!/usr/bin/env python3
# Copyright (C) 2019 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.

# This file should do the same thing when being invoked in any of these ways:
# ./traceconv
# python traceconv
# bash traceconv
# cat ./traceconv | bash
# cat ./traceconv | python -

BASH_FALLBACK = """ "
exec python3 - "$@" <<'#'EOF
#"""

import hashlib
import os
import sys
import subprocess
import tempfile
import platform


TRACE_TO_TEXT_SHAS = {
    'linux': '7e3e10dfb324e31723efd63ac25037856e06eba0',
    'mac': '21f0f42dd019b4f09addd404a114fbf2322ca8a4',
}
TRACE_TO_TEXT_PATH = tempfile.gettempdir()
TRACE_TO_TEXT_BASE_URL = ('https://storage.googleapis.com/perfetto/')


def DownloadURL(url, out_file):
  subprocess.check_call(['curl', '-L', '-#', '-o', out_file, url])


def check_hash(file_name, sha_value):
  with open(file_name, 'rb') as fd:
    file_hash = hashlib.sha1(fd.read()).hexdigest()
    return file_hash == sha_value


def load_trace_to_text(platform):
  sha_value = TRACE_TO_TEXT_SHAS[platform]
  file_name = 'trace_to_text-' + platform + '-' + sha_value
  local_file = os.path.join(TRACE_TO_TEXT_PATH, file_name)

  if os.path.exists(local_file):
    if not check_hash(local_file, sha_value):
      os.remove(local_file)
    else:
      return local_file

  url = TRACE_TO_TEXT_BASE_URL + file_name
  DownloadURL(url, local_file)
  if not check_hash(local_file, sha_value):
    os.remove(local_file)
    raise ValueError("Invalid signature.")
  os.chmod(local_file, 0o755)
  return local_file


def main(argv):
  os_name = None
  if sys.platform.startswith('linux'):
    os_name = 'linux'
  elif sys.platform.startswith('darwin'):
    os_name = 'mac'
  else:
    print("Invalid platform: {}".format(sys.platform))
    return 1

  arch = platform.machine()
  if arch not in ['x86_64', 'amd64']:
    print("Prebuilts are only available for x86_64 (found '{}' instead).".format(arch))
    print("Follow https://perfetto.dev/docs/contributing/build-instructions to build locally.")
    return 1

  trace_to_text_binary = load_trace_to_text(os_name)
  os.execv(trace_to_text_binary, [trace_to_text_binary] + argv[1:])


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

#EOF
