#!/usr/bin/env python3
# Copyright (C) 2017 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 argparse
import os
import sys


def Main():
  parser = argparse.ArgumentParser()
  parser.add_argument('--verbose', '-v', action='store_true')
  parser.add_argument('--pid', help='(optional) save pid into given file')
  args = parser.parse_args()

  root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

  if sys.platform.startswith('linux'):
    emulator_root = os.path.join(root_dir, 'buildtools', 'emulator',
                                 'linux-x86_64')
    emulator_path = os.path.join(emulator_root, 'qemu', 'linux-x86_64')
  else:
    emulator_root = os.path.join(root_dir, 'buildtools', 'emulator',
                                 'darwin-x86_64')
    emulator_path = os.path.join(emulator_root, 'qemu', 'darwin-x86_64')

  aosp_path = os.path.join(root_dir, 'buildtools', 'aosp-arm')

  env = {
      # The CI env doesn't set this and causes the emulator to fallback in
      # 32-bit mode with a "Cannot decide host bitness because $SHELL" error.
      'SHELL': '/bin/bash',
      'LD_LIBRARY_PATH': os.path.join(emulator_root, 'lib64', 'qt', 'lib'),
      'DYLD_LIBRARY_PATH': os.path.join(emulator_root, 'lib64', 'qt', 'lib'),
  }
  emulator_bin = os.path.join(emulator_path, 'qemu-system-armel')
  emulator_args = [
      '-no-window', '-no-snapshot', '-gpu', 'off', '-no-accel', '-sysdir',
      aosp_path, '-system',
      os.path.join(aosp_path, 'system-qemu.img'), '-kernel',
      os.path.join(aosp_path, 'kernel-ranchu'), '-ramdisk',
      os.path.join(aosp_path, 'ramdisk.img'), '-vendor',
      os.path.join(aosp_path, 'vendor-qemu.img'), '-data',
      os.path.join(aosp_path, 'userdata-qemu.img')
  ]
  print('\n'.join('='.join(x) for x in env.items()))
  print(' '.join([emulator_bin] + emulator_args))
  if args.pid:
    with open(args.pid, 'w') as f:
      f.write(str(os.getpid()))
  os.execve(emulator_bin, [emulator_bin] + emulator_args, env)


if __name__ == '__main__':
  sys.exit(Main())
