# Copyright 2015 The Bazel Authors. All rights reserved.
#
# 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.
"""This package contains various functions used when building containers."""

import json
import tarfile

from six import raise_from


def ExtractValue(value):
  """Return the contents of a file point to by value if it starts with an @.

  Args:
    value: The possible filename to extract or a string.

  Returns:
    The content of the file if value starts with an @, or the passed value.
  """
  if value.startswith('@'):
    with open(value[1:], 'r') as f:
      value = f.read()
  return value


def GetTarFile(f, name):
  """Returns the content of a file inside a tar file.

  This method looks for ./f, /f and f file entry in a tar file and if found,
  return its content. This allows to read file with various path prefix.

  Args:
    f: The tar file to read.
    name: The name of the file inside the tar file.

  Returns:
    The content of the file, or None if not found.
  """
  with open(f, 'rb') as fobj:
    try:
      with tarfile.open(fileobj=fobj) as tar:
        members = [tarinfo.name for tarinfo in tar.getmembers()]
        for i in ['', './', '/']:
          if i + name in members:
            return tar.extractfile(i + name).read()
    except tarfile.ReadError as error:
      raise_from(IOError('Error when reading %s' % f), error)
  return None


def GetManifestFromTar(f=None):
  """Returns the manifest array from a tar file.

  Args:
    f: The tar file to read.

  Returns:
    The content of the manifest file or an empty array if not found.
  """
  if f:
    raw_manifest_data = GetTarFile(f, 'manifest.json')
    if raw_manifest_data:
      return json.loads(raw_manifest_data)
  return []


def GetLatestManifestFromTar(f=None):
  """Returns the latest manifest entry from a tar file.

  The latest manifest entry is the one at the bottom.

  Args:
    f: The tar file to read.

  Returns:
    The latest manifest entry object, or None if not found.
  """
  manifest_data = GetManifestFromTar(f)
  return manifest_data[-1] if manifest_data else None
