#!/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.

"""Utilities for all our deps-management stuff."""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import shutil
import subprocess
import sys
import tarfile
import time
import zipfile


def RunSubprocessWithRetry(cmd):
  """Invokes the subprocess and backs off exponentially on fail."""
  for i in range(5):
    try:
      subprocess.check_call(cmd)
      return
    except subprocess.CalledProcessError as exception:
      backoff = pow(2, i)
      print('Got %s, retrying in %d seconds...' % (exception, backoff))
      time.sleep(backoff)

  print('Giving up.')
  raise exception


def DownloadFilesFromGoogleStorage(path, auto_platform=True):
  print('Downloading files in %s...' % path)

  extension = 'bat' if 'win32' in sys.platform else 'py'
  cmd = ['download_from_google_storage.%s' % extension,
         '--bucket=chromium-webrtc-resources',
         '--directory', path]
  if auto_platform:
    cmd += ['--auto_platform', '--recursive']
  subprocess.check_call(cmd)


# Code partially copied from
# https://cs.chromium.org#chromium/build/scripts/common/chromium_utils.py
def RemoveDirectory(*path):
  """Recursively removes a directory, even if it's marked read-only.

  Remove the directory located at *path, if it exists.

  shutil.rmtree() doesn't work on Windows if any of the files or directories
  are read-only, which svn repositories and some .svn files are.  We need to
  be able to force the files to be writable (i.e., deletable) as we traverse
  the tree.

  Even with all this, Windows still sometimes fails to delete a file, citing
  a permission error (maybe something to do with antivirus scans or disk
  indexing).  The best suggestion any of the user forums had was to wait a
  bit and try again, so we do that too.  It's hand-waving, but sometimes it
  works. :/
  """
  file_path = os.path.join(*path)
  print('Deleting `{}`.'.format(file_path))
  if not os.path.exists(file_path):
    print('`{}` does not exist.'.format(file_path))
    return

  if sys.platform == 'win32':
    # Give up and use cmd.exe's rd command.
    file_path = os.path.normcase(file_path)
    for _ in range(3):
      print('RemoveDirectory running %s' % (' '.join(
          ['cmd.exe', '/c', 'rd', '/q', '/s', file_path])))
      if not subprocess.call(['cmd.exe', '/c', 'rd', '/q', '/s', file_path]):
        break
      print('  Failed')
      time.sleep(3)
    return
  else:
    shutil.rmtree(file_path, ignore_errors=True)


def UnpackArchiveTo(archive_path, output_dir):
  extension = os.path.splitext(archive_path)[1]
  if extension == '.zip':
    _UnzipArchiveTo(archive_path, output_dir)
  else:
    _UntarArchiveTo(archive_path, output_dir)


def _UnzipArchiveTo(archive_path, output_dir):
  print('Unzipping {} in {}.'.format(archive_path, output_dir))
  zip_file = zipfile.ZipFile(archive_path)
  try:
    zip_file.extractall(output_dir)
  finally:
    zip_file.close()


def _UntarArchiveTo(archive_path, output_dir):
  print('Untarring {} in {}.'.format(archive_path, output_dir))
  tar_file = tarfile.open(archive_path, 'r:gz')
  try:
    tar_file.extractall(output_dir)
  finally:
    tar_file.close()


def GetPlatform():
  if sys.platform.startswith('win'):
    return 'win'
  if sys.platform.startswith('linux'):
    return 'linux'
  if sys.platform.startswith('darwin'):
    return 'mac'
  raise Exception("Can't run on platform %s." % sys.platform)


def GetExecutableExtension():
  return '.exe' if GetPlatform() == 'win' else ''
