#!/usr/bin/python3
#
# -*- coding: utf-8 -*-
# vim: ts=4 sw=4 tw=100 et ai si
#
# Copyright (C) 2020-2022 Intel Corporation
# SPDX-License-Identifier: BSD-3-Clause
#
# Author: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>

"""Prepare CHANGELOG.md to the next release."""

import sys
import argparse
from pathlib import Path
from datetime import datetime
from itertools import zip_longest
import _Changelogmd

try:
    import argcomplete
except ImportError:
    # We can live without argcomplete, we only lose tab completions.
    argcomplete = None

VERSION = "1.0.0"
OWN_NAME = "prepare_changelog_md"

def parse_arguments():
    """Parse input arguments."""

    text = sys.modules[__name__].__doc__
    parser = argparse.ArgumentParser(description=text, prog=OWN_NAME)

    text = "Print version and exit."
    parser.add_argument("--version", action="version", help=text, version=VERSION)

    text = "The new project version number to update 'CHANGELOG.md' with."
    parser.add_argument("newver", metavar="NEWVER", help=text)

    text = "The Changelog.md file path to update"
    arg = parser.add_argument("chmd_path", metavar="PATH", type=Path, help=text)
    if argcomplete:
        arg.completer = argcomplete.completers.FilesCompleter()

    if argcomplete:
        argcomplete.autocomplete(parser)

    return parser.parse_args()

def _format_release_entry(tmp_entry, newver):
    """
    Format and return the release changelog entry based on the temporary entry 'tmp_entry'.
    """

    lines = tmp_entry.splitlines()

    lines[0] = lines[0].replace("ADD NEW VERSION HERE", newver)
    date = datetime.now().strftime("%Y-%m-%d")
    lines[0] = lines[0].replace("ADD DATE HERE", date)

    # Strip the changelog lines so that they do not have empty sub-sections. E.g., an entry like
    # this:
    # ### Fixed
    # ### Added
    # - log
    # ### Removed
    # ### Changed
    #
    # would become:
    #
    # ### Added
    # - log
    stripped = []
    for line1, line2 in zip_longest(lines, lines[1:], fillvalue=""):
        if line1.startswith("###") and (not line2.strip() or line2.startswith("###")):
            continue
        stripped.append(line1)

    prefix = "## [ADD NEW VERSION HERE] - ADD DATE HERE\n" \
             "### Fixed\n" \
             "### Added\n" \
             "### Removed\n" \
             "### Changed\n"

    return prefix + "\n" + "\n".join(stripped) + "\n"

def main():
    """Script entry point."""

    args = parse_arguments()

    outtext = []
    outtext.append(_Changelogmd.get_preamble(args.chmd_path))

    for entry in _Changelogmd.get_chmd_entries(args.chmd_path):
        if "ADD DATE HERE" in entry:
            entry = _format_release_entry(entry, args.newver)
        outtext.append(entry + "\n")

    with open(args.chmd_path, "w", encoding="utf-8") as fobj:
        fobj.write("".join(outtext).strip())

    return 0

if __name__ == "__main__":
    sys.exit(main())
