# Copyright 2017 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.
"""Tools for dealing with Docker Image layers."""

load(":list.bzl", "reverse")
load(":path.bzl", _get_runfile_path="runfile")

def get_from_target(unused_ctx, target):
  if hasattr(target, "docker_layers"):
    return target.docker_layers
  else:
    # TODO(mattmoor): Use containerregistry.client's FromTarball
    # to create an entry from a tarball base image.
    return []


def assemble(ctx, layers, tags_to_names, output):
  """Create the full image from the list of layers."""
  layers = [l["layer"] for l in layers]
  args = [
      "--output=" + output.path,
  ] + [
      "--tags=" + tag + "=@" + tags_to_names[tag].path
      for tag in tags_to_names
  ] + ["--layer=" + l.path for l in layers]
  inputs = layers + tags_to_names.values()
  ctx.action(
      executable = ctx.executable.join_layers,
      arguments = args,
      inputs = inputs,
      outputs = [output],
      mnemonic = "JoinLayers"
  )


def incremental_load(ctx, layers, images, output):
  """Generate the incremental load statement."""
  ctx.template_action(
      template = ctx.file.incremental_load_template,
      substitutions = {
          "%{load_statements}": "\n".join([
              "incr_load '%s' '%s' '%s'" % (_get_runfile_path(ctx, l["name"]),
                                            _get_runfile_path(ctx, l["id"]),
                                            _get_runfile_path(ctx, l["layer"]))
              # The last layer is the first in the list of layers.
              # We reverse to load the layer from the parent to the child.
              for l in reverse(layers)]),
          "%{tag_statements}": "\n".join([
              "tag_layer '%s' '%s' '%s'" % (
                  img,
                  _get_runfile_path(ctx, images[img]["name"]),
                  _get_runfile_path(ctx, images[img]["id"]))
              for img in images
          ])
      },
      output = output,
      executable = True)


tools = {
    "incremental_load_template": attr.label(
        default=Label("//tools/build_defs/docker:incremental_load_template"),
        single_file=True,
        allow_files=True),
    "join_layers": attr.label(
        default=Label("//tools/build_defs/docker:join_layers"),
        cfg="host",
        executable=True,
        allow_files=True)
}
