import os

from twitter.common.dirutil import safe_mkdir

import pkg_resources


def unpack_assets(output_dir, module, asset_path, execute=lambda x: None):
  """
    Extract files from a module in a package into 'output_dir'.

    :param output_dir: The directory to copy the assets *root* to.
    :param module: The module in the package to find the assets in. e.g., mysos.executor.
    :param asset_path: The path of the asset relative to the module root to unpack.
    :param execute: A function that expects a single argument as the path to an asset file. It can
                    be used to process this file.

    NOTE: If the specified 'asset_path' is a directory, its contents are copied but it itself is not
          recreated in the output directory. e.g., <module_dir>/files/bin/file.sh is copied to
          <output_dir>/bin/file.sh. An analogy is that its like `cp -R asset_path/* output_dir` and
          not like `cp -R asset_path output_dir`.
  """
  _unpack_assets(output_dir, module, asset_path, execute, asset_path)


def _unpack_assets(output_dir, module, asset_root, execute, current_path):
  """
    The internal helper function for unpack_assets(...) recursion.
    :param current_path: Records the current
  """
  for asset in pkg_resources.resource_listdir(module, current_path):
    asset_target = os.path.join(os.path.relpath(current_path, asset_root), asset)
    if pkg_resources.resource_isdir(module, os.path.join(current_path, asset)):
      safe_mkdir(os.path.join(output_dir, asset_target))
      _unpack_assets(output_dir, module, asset_root, execute, os.path.join(current_path, asset))
    else:
      output_file = os.path.join(output_dir, asset_target)
      with open(output_file, 'wb') as fp:
        fp.write(pkg_resources.resource_string(
            module, os.path.join(asset_root, asset_target)))
        execute(output_file)
