# 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("@debian_docker//package_managers:download_pkgs.bzl", _download = "download")
load("@debian_docker//package_managers:install_pkgs.bzl", _install = "install")

def cleanup_commands():
    return {
        "java":"rm -rf /etc/ssl/certs/java/cacerts /tmp/hsperfdata_root/* /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/classes.jsa",
        "python":"rm -rf /usr/lib/python3.4/__pycache__/ /usr/lib/python3.4/idlelib/__pycache__/ /usr/lib/python3.4/asyncio/__pycache__/",
    }

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 []
  if installables_tars == [] and ctx.file.installables_tar:
    installables_tars = [ctx.file.installables_tar]
  installation_cleanup_commands = installation_cleanup_commands or ctx.attr.installation_cleanup_commands

  # Download packages if packages list is not empty.
  if 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 intermediate output file generated by install_pkgs rule.
    combined_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=[combined_installables_tar],
      command="tar cvf {output_tar} --files-from /dev/null && tar --concatenate -v --file={output_tar} {input_tars}".format(
        output_tar=combined_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 'combined_installables_tar' and 'installation_cleanup_commands'.
    _install.implementation(
      ctx,
      image_tar=ctx.files.base[0],
      installables_tar= combined_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' should also only be specified when
      'packages' or 'installables_tar' is specified.

  Experimental rule.
  """

  # Input validations
  if "debs" in kwargs:
    fail("debs is not supported in language_tool_layer.")

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

  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.file.installables_tar:
    installables_tars.append(ctx.file.installables_tar)
  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.

  Experimental rule.
  """

  # Input validations
  if "debs" in kwargs:
    fail("debs is not supported in toolchain_container.")

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

  toolchain_container_(**kwargs)
