# Copyright 2016 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.
"""Module to generate sample bazelrc file."""

import os
from string import Template

from util import get_git_root

GIT_ROOT = get_git_root()
BAZELRC_DIR = os.path.join(GIT_ROOT, "bazelrc")
LATEST_BAZELRC_LINK = BAZELRC = os.path.join(BAZELRC_DIR, "latest.bazelrc")
LICENCE_TPL = os.path.join(GIT_ROOT, "release", "license.tpl")
BAZELRC_TPL = os.path.join(GIT_ROOT, "release", "bazelrc.tpl")


def create_bazelrc_and_update_link(bazel_version):
  """Creates new sample .bazelrc file and update latest.bazelrc symlink.

  Example bazelrc files can be found in directory bazelrc/.

  There is one sample bazelrc file Bazel version. bazelrc/latest.bazelrc should
  always be symlinked to the .bazelrc file for the latest version of Bazel.

  If the file already exists in this repo, the script will delete it and
  generate new one.

  Args:
    bazel_version: string, the version of Bazel used to generate the configs.

  """
  bazelrc_path = os.path.join(
      BAZELRC_DIR, "bazel-{version}.bazelrc".format(version=bazel_version))

  # Remove old version of this .bazelrc file.
  if os.path.exists(bazelrc_path):
    os.remove(bazelrc_path)

  with open(bazelrc_path, "w") as bazelrc_file:
    # Write license header.
    with open(LICENCE_TPL, "r") as license_header:
      bazelrc_file.write(license_header.read())

    # Write sample .bazelrc body.
    with open(BAZELRC_TPL, "r") as tpl_file:
      tpl = Template(tpl_file.read()).substitute(BAZEL_VERSION=bazel_version)
      bazelrc_file.write(tpl)

  # Update latest.bazelrc link
  if os.path.exists(LATEST_BAZELRC_LINK):
    os.remove(LATEST_BAZELRC_LINK)
  os.symlink(os.path.basename(bazelrc_path), LATEST_BAZELRC_LINK)
