#!/usr/bin/env python
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
""" Gather all the fuchsia artifacts to a destination directory.
"""

import argparse
import errno
import json
import os
import platform
import shutil
import subprocess
import sys

_ARTIFACT_PATH_TO_DST = {
    'flutter_jit_runner': 'flutter_jit_runner',
    'icudtl.dat': 'data/icudtl.dat',
    'dart_runner': 'dart_runner',
    'flutter_patched_sdk': 'flutter_patched_sdk'
}


def EnsureParentExists(path):
  dir_name, _ = os.path.split(path)
  if not os.path.exists(dir_name):
    os.makedirs(dir_name)


def CopyPath(src, dst):
  try:
    EnsureParentExists(dst)
    shutil.copytree(src, dst)
  except OSError as exc:
    if exc.errno == errno.ENOTDIR:
      shutil.copy(src, dst)
    else:
      raise


def CreateMetaPackage(dst_root, far_name):
  meta = os.path.join(dst_root, 'meta')
  if not os.path.isdir(meta):
    os.makedirs(meta)
  content = {}
  content['name'] = far_name
  content['version'] = '0'
  package = os.path.join(meta, 'package')
  with open(package, 'w') as out_file:
    json.dump(content, out_file)


def GatherArtifacts(src_root, dst_root, create_meta_package=True):
  if not os.path.exists(dst_root):
    os.makedirs(dst_root)
  else:
    shutil.rmtree(dst_root)

  for src_rel, dst_rel in _ARTIFACT_PATH_TO_DST.iteritems():
    src_full = os.path.join(src_root, src_rel)
    dst_full = os.path.join(dst_root, dst_rel)
    if not os.path.exists(src_full):
      print('Unable to find artifact: ', str(src_full))
      sys.exit(1)
    CopyPath(src_full, dst_full)

  if create_meta_package:
    CreateMetaPackage(dst_root, 'flutter_runner')


def main():
  parser = argparse.ArgumentParser()

  parser.add_argument(
      '--artifacts-root', dest='artifacts_root', action='store', required=True)
  parser.add_argument(
      '--dest-dir', dest='dst_dir', action='store', required=True)

  args = parser.parse_args()

  assert os.path.exists(args.artifacts_root)
  dst_parent = os.path.abspath(os.path.join(args.dst_dir, os.pardir))
  assert os.path.exists(dst_parent)

  GatherArtifacts(args.artifacts_root, args.dst_dir)
  return 0


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