#!/usr/bin/env python3
# Copyright 2022 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Check out the Fuchsia SDK from a given GCS path. Should be used in a
'hooks_os' entry so that it only runs when .gclient's custom_vars includes
'fuchsia'."""

import argparse
import logging
import os
import platform
import subprocess
import sys
from typing import Optional

from gcs_download import DownloadAndUnpackFromCloudStorage

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
                                             'test')))

from common import SDK_ROOT, get_host_arch, get_host_os, make_clean_directory


def _GetHostArch():
  host_arch = platform.machine()
  # platform.machine() returns AMD64 on 64-bit Windows.
  if host_arch in ['x86_64', 'AMD64']:
    return 'amd64'
  elif host_arch == 'aarch64':
    return 'arm64'
  raise Exception('Unsupported host architecture: %s' % host_arch)


def GetSDKOverrideGCSPath(path: Optional[str] = None) -> Optional[str]:
  """Fetches the sdk override path from a file.

  Args:
    path: the full file path to read the data from.
      defaults to sdk_override.txt in the directory of this file.

  Returns:
    The contents of the file, stripped of white space.
      Example: gs://fuchsia-artifacts/development/some-id/sdk
  """
  if not path:
    path = os.path.join(os.path.dirname(__file__), 'sdk_override.txt')

  if not os.path.isfile(path):
    return None

  with open(path, 'r') as f:
    return f.read().strip()


def _GetTarballPath(gcs_tarball_prefix: str) -> str:
  """Get the full path to the sdk tarball on GCS"""
  platform = get_host_os()
  arch = _GetHostArch()
  return f'{gcs_tarball_prefix}/{platform}-{arch}/gn.tar.gz'


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('--cipd-prefix', help='CIPD base directory for the SDK.')
  parser.add_argument('--version', help='Specifies the SDK version.')
  parser.add_argument('--verbose',
                      '-v',
                      action='store_true',
                      help='Enable debug-level logging.')
  args = parser.parse_args()

  logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO)

  # Exit if there's no SDK support for this platform.
  try:
    host_plat = get_host_os()
  except:
    logging.warning('Fuchsia SDK is not supported on this platform.')
    return 0

  gcs_tarball_prefix = GetSDKOverrideGCSPath()

  # Download from CIPD if there is no override file.
  if not gcs_tarball_prefix:
    if not args.cipd_prefix:
      parser.exit(1, '--cipd-prefix must be specified.')
    if not args.version:
      parser.exit(2, '--version must be specified.')
    logging.info('Downloading GN SDK from CIPD...')
    ensure_file = '%s%s-%s %s' % (args.cipd_prefix, host_plat, _GetHostArch(),
                                  args.version)
    subprocess.run(('cipd', 'ensure', '-ensure-file', '-', '-root', SDK_ROOT,
                    '-log-level', 'warning'),
                   check=True,
                   text=True,
                   input=ensure_file)
    return 0

  # Always re-download the SDK.
  logging.info('Downloading GN SDK from GCS...')
  make_clean_directory(SDK_ROOT)
  DownloadAndUnpackFromCloudStorage(_GetTarballPath(gcs_tarball_prefix),
                                    SDK_ROOT)
  return 0


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