# pylint: disable=g-bad-file-header
# 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 tool convert Bazel's changelog file to debian changelog format."""

from datetime import datetime
import sys


def main(input_file, changelog_file, output_file):
  changelog_out = open(output_file, "w")
  changelog = None
  version = None
  with open(input_file, "r") as status_file:
    for line in status_file:
      line = line.strip()

      if line.startswith("RELEASE_NOTES"):
        changelog = line[14:].strip().replace("\f", "\n")
      elif line.startswith("RELEASE_NAME"):
        version = line[13:].strip()

  if changelog:
    time_stamp = None
    lines = changelog.split("\n")
    header = lines[0]
    lines = lines[4:]  # Skip the header
    if lines[0] == "Cherry picks:":
      # Skip cherry picks list
      i = 1
      while lines[i].strip():
        i += 1
      lines = lines[i + 1:]

    # Process header
    parts = header.split(" ")
    time_stamp = datetime.strptime(
        parts[2], "(%Y-%m-%d)").strftime("%a, %d %b %Y %H:%M:%S +0100")
    changelog_out.write("bazel (%s) unstable; urgency=low\n" % version)

    for line in lines:
      if line.startswith("+") or line.startswith("-"):
        parts = line.split(" ")
        line = "*" + line[1:]
        changelog_out.write("  %s\n" % line)

      elif line.endswith(":"):
        changelog_out.write("\n  %s\n" % line)

      elif line:
        changelog_out.write("    %s\n" % line)

    if time_stamp:
      changelog_out.write(
          "\n -- The Bazel Authors <bazel-dev@googlegroups.com>  %s\n\n" %
          time_stamp)
  else:
    # Develeopment version, generate a changelog from the change log file
    with open(changelog_file, "r") as changelog_in:
      for line in changelog_in:
        line = line.strip()
        if line.startswith("## Release"):
          parts = line.split(" ")
          version = parts[2]
          time_stamp = datetime.strptime(
              parts[3], "(%Y-%m-%d)").strftime("%a, %d %b %Y %H:%M:%S +0100")
          changelog_out.write("bazel (%s~HEAD) unstable; urgency=low\n" %
                              version)
          changelog_out.write("    Development version\n")
          changelog_out.write(
              "\n -- The Bazel Authors <bazel-dev@googlegroups.com>  %s\n\n" %
              time_stamp)
          # Stop after parsing latest release
          return


if __name__ == "__main__":
  main(sys.argv[1], sys.argv[2], sys.argv[3])
