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

"""Definitions of language_tool_layer and toolchain_container rules."""

load("@io_bazel_rules_docker//container:container.bzl", _container = "container")
load("@base_images_docker//package_managers:download_pkgs.bzl", _download = "download")
load("@base_images_docker//package_managers:install_pkgs.bzl", _install = "install")

def _input_validation(kwargs):
  if "debs" in kwargs:
    fail("debs is not supported.")

  if "packages" in kwargs and "installables_tar" in kwargs:
    fail("'packages' and 'installables_tar' cannot be specified at the same time.")

  has_no_packages = "packages" not in kwargs or kwargs["packages"] == []
  if has_no_packages and "additional_repos" in kwargs:
    fail("'additional_repos' can only be specified when 'packages' is not empty.")

  has_no_tar = "installables_tar" not in kwargs or kwargs["installables_tar"] == ""
  if has_no_packages and has_no_tar and "installation_cleanup_commands" in kwargs:
    fail("'installation_cleanup_commands' can only be specified when at least " +
      "one of 'packages' or 'installables_tar' is not empty.")

def _language_tool_layer_impl(ctx, symlinks=None, env=None, tars=None,
                              files=None, packages=None, additional_repos=None,
                              installables_tars=None, installation_cleanup_commands=""):
  """Implementation for the language_tool_layer rule.

  Args:
    ctx: ctx of container_image rule
           (https://github.com/bazelbuild/rules_docker#container_image-1) +
         ctx of download_pkgs rule
           (https://github.com/GoogleCloudPlatform/base-images-docker/blob/master/package_managers/download_pkgs.bzl) +
         ctx of install_pkgs rule
           (https://github.com/GoogleCloudPlatform/base-images-docker/blob/master/package_managers/install_pkgs.bzl) +
         some overrides.
    symlinks: str Dict, overrides ctx.attr.symlinks
    env: str Dict, overrides ctx.attr.env
    tars: File list, overrides ctx.files.tars
    files: File list, overrides ctx.files.files
    packages: str List, overrides ctx.attr.packages
    additional_repos: str List, overrides ctx.attr.additional_repos
    installables_tars: File list, overrides [ctx.file.installables_tar]
    installation_cleanup_commands: str, overrides ctx.attr.installation_cleanup_commands

  TODO(ngiraldo): add validations to restrict use of any other attrs.
  """

  symlinks = symlinks or ctx.attr.symlinks
  env = env or ctx.attr.env
  tars = tars or ctx.files.tars
  files = files or ctx.files.files
  packages = packages or ctx.attr.packages
  additional_repos = additional_repos or ctx.attr.additional_repos
  installables_tars = installables_tars or []
  installation_cleanup_commands = installation_cleanup_commands or ctx.attr.installation_cleanup_commands

  # If ctx.file.installables_tar is specified, ignore 'packages' and other tars in installables_tars.
  if ctx.file.installables_tar:
    installables_tars = [ctx.file.installables_tar]
  # Otherwise, download packages if packages list is not empty, and add the tar of downloaded
  # debs to installables_tars.
  elif packages != []:
    # Declare intermediate output file generated by download_pkgs rule.
    download_pkgs_output_executable = ctx.actions.declare_file(ctx.attr.name + "-download_pkgs_output_executable.sh")
    download_pkgs_output_tar = ctx.actions.declare_file(ctx.attr.name + "-download_pkgs_output_tar.tar")
    download_pkgs_output_script = ctx.actions.declare_file(ctx.attr.name + "-download_pkgs_output_script.sh")

    # download_pkgs rule consumes 'packages' and 'additional_repos'.
    _download.implementation(
      ctx,
      image_tar=ctx.files.base[0],
      packages=packages,
      additional_repos=additional_repos,
      output_executable=download_pkgs_output_executable,
      output_tar=download_pkgs_output_tar,
      output_script=download_pkgs_output_script
    )
    installables_tars.append(download_pkgs_output_tar)

  # Prepare new base image for the container_image rule.
  new_base = ctx.files.base[0]

  # Install debian packages in the base image.
  if installables_tars != []:
    # Create a list of paths of installables_tars.
    installables_tars_paths = []
    for tar in installables_tars:
      if tar:
        installables_tars_paths.append(tar.path)

    # Declare file for final tarball of debian packages to install.
    final_installables_tar = ctx.actions.declare_file(ctx.attr.name + "-packages.tar")

    # Combine all installables_tars into one tar. install_pkgs only takes a
    # single installables_tar as input.
    ctx.actions.run_shell(
      inputs=installables_tars,
      outputs=[final_installables_tar],
      command="tar cvf {output_tar} --files-from /dev/null && tar --concatenate -v --file={output_tar} {input_tars}".format(
        output_tar=final_installables_tar.path,
        input_tars=' '.join(installables_tars_paths)
      ),
    )

    # Declare intermediate output file generated by install_pkgs rule.
    install_pkgs_out = ctx.actions.declare_file(ctx.attr.name + "-with-packages.tar")
    # install_pkgs rule consumes 'final_installables_tar' and 'installation_cleanup_commands'.
    _install.implementation(
      ctx,
      image_tar=ctx.files.base[0],
      installables_tar= final_installables_tar,
      installation_cleanup_commands = installation_cleanup_commands,
      output_image_name = ctx.attr.name + "-with-packages",
      output_tar=install_pkgs_out
    )
    # Set the image with packages installed to be the new base.
    new_base = install_pkgs_out

  # Install tars and configure env, symlinks using the container_image rule.
  result = _container.image.implementation(ctx, base=new_base, symlinks=symlinks, env=env, tars=tars, files=files)

  return struct(runfiles = result.runfiles,
                files = result.files,
                container_parts = result.container_parts,
                tars = tars,
                input_files = files,
                env = env,
                symlinks = symlinks,
                packages = packages,
                additional_repos = additional_repos,
                installables_tar = ctx.file.installables_tar,
                installation_cleanup_commands = installation_cleanup_commands
                )

language_tool_layer_attrs = _container.image.attrs + _install.attrs + _download.attrs + {
    # Redeclare following attributes as non-mandatory.
    "image_tar": attr.label(
        allow_files = True,
        single_file = True,
    ),
    "packages": attr.string_list(),
    "installables_tar": attr.label(
        allow_files = True,
        single_file = True,
    ),
    "output_image_name": attr.string(),
}

language_tool_layer_ = rule(
    attrs = language_tool_layer_attrs,
    executable = True,
    outputs = _container.image.outputs,
    implementation = _language_tool_layer_impl,
)

def language_tool_layer(**kwargs):
  """A wrapper around attrs in container_image, download_pkgs and install_pkgs rules.

  Downloads and installs debian packages using
  https://github.com/GoogleCloudPlatform/base-images-docker/tree/master/package_managers,
  and configures the rest using https://github.com/bazelbuild/rules_docker#container_image-1.

  Args:
    Same args as https://github.com/bazelbuild/rules_docker#container_image-1
    minus:
      debs: debian packages should be listed in 'packages', or be included in
            'installables_tar' as .deb files.
    plus:
      packages: list of packages to fetch and install in the base image.
      additional_repos: list of additional debian package repos to use,
        in sources.list format.
      installables_tar: a tar of debian packages to install in the base image.
      installation_cleanup_commands: cleanup commands to run after package
        installation.

  Note:
    - 'additional_repos' can only be specified when 'packages' is speficified.
    - 'installation_cleanup_commands' can only be specified when at least one of
      'packages' or 'installables_tar' is specified.

  Experimental rule.
  """

  _input_validation(kwargs)

  language_tool_layer_(**kwargs)

def _toolchain_container_impl(ctx):
  """Implementation for the toolchain_container rule.

  toolchain_container rule composes all attrs from itself and language_tool_layer(s),
  and generates container using container_image rule.

  Args:
    ctx: ctx as the same as for container_image + list of language_tool_layer(s)
    https://github.com/bazelbuild/rules_docker#container_image
  """

  tars = []
  files = []
  env = {}
  symlinks = {}
  packages = []
  additional_repos = []
  installables_tars = []
  installation_cleanup_commands = "cd ."

  # TODO(ngiraldo): we rewrite env and symlinks if there are conficts,
  # warn the user of conflicts or error out.
  for layer in ctx.attr.language_layers:
    tars.extend(layer.tars)
    files.extend(layer.input_files)
    env.update(layer.env)
    symlinks.update(layer.symlinks)
    packages.extend(layer.packages)
    additional_repos.extend(layer.additional_repos)
    if layer.installables_tar:
      installables_tars.append(layer.installables_tar)
    if layer.installation_cleanup_commands:
      installation_cleanup_commands += (" && " + layer.installation_cleanup_commands)
  tars.extend(ctx.attr.tars)
  env.update(ctx.attr.env)
  symlinks.update(ctx.attr.symlinks)
  packages.extend(ctx.attr.packages)
  additional_repos.extend(ctx.attr.additional_repos)
  if ctx.attr.installation_cleanup_commands:
    installation_cleanup_commands += (" && " + ctx.attr.installation_cleanup_commands)

  files = depset(files).to_list()
  packages = depset(packages).to_list()
  additional_repos = depset(additional_repos).to_list()
  installables_tars = depset(installables_tars).to_list()

  return _language_tool_layer_impl(ctx,
                                   symlinks=symlinks,
                                   env=env,
                                   tars=tars,
                                   files=files,
                                   packages=packages,
                                   additional_repos=additional_repos,
                                   installables_tars=installables_tars,
                                   installation_cleanup_commands=installation_cleanup_commands
                                   )

toolchain_container_ = rule(
    attrs = language_tool_layer_attrs + {
        "language_layers": attr.label_list(),
    },
    executable = True,
    outputs = _container.image.outputs,
    implementation = _toolchain_container_impl,
)

def toolchain_container(**kwargs):
  """Composes multiple language_tool_layers into a single resulting image.

  Args:
    Same args as https://github.com/bazelbuild/rules_docker#container_image-1
    minus:
      debs: debian packages should be listed in 'packages', or be included in
            'installables_tar' as .deb files.
    plus:
      language_layers: a list of language_tool_layer.
      installables_tar: a tar of debian packages to install in the base image.
      packages: list of packages to fetch and install in the base image.
      additional_repos: list of additional debian package repos to use,
        in sources.list format.
      installation_cleanup_commands: cleanup commands to run after package
        installation.

  If 'installables_tar' is specified in the 'toolchain_container' rule, then
  'packages' or 'installables_tar' specified in any of the 'language_layers'
  passed to this 'toolchain_container' rule will be ignored.

  Experimental rule.
  """

  _input_validation(kwargs)

  toolchain_container_(**kwargs)
