#!/usr/bin/env python3
"""
Check if the conventional commits since the last release require a new release.

Works around Commitizen's version handling when bumping from a pre-release:

https://github.com/commitizen-tools/commitizen/issues/688#issue-1628052526
"""

import sys
import argparse

from commitizen import exceptions  # type: ignore # pylint: disable=import-error
from commitizen import git  # pylint: disable=import-error
from commitizen import bump  # pylint: disable=import-error
from commitizen import config  # pylint: disable=import-error
from commitizen import commands  # pylint: disable=import-error

arg_parser = argparse.ArgumentParser(
    description=__doc__.strip(),
    formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
arg_parser.add_argument(
    "--compare-ref",
    "-c",
    help="The git ref used as the start of the revision range whose commits to check.",
)


def main(args=None):  # pylint: disable=missing-function-docstring
    parsed_args = arg_parser.parse_args(args=args)
    conf = config.read_cfg()
    # Reproduce `commitizen.commands.bump.Bump.__init__()`:
    arguments = {
        arg: None
        for arg in (
            "tag_format",
            "prerelease",
            "increment",
            "bump_message",
            "gpg_sign",
            "annotated_tag",
            "major_version_zero",
            "prerelease_offset",
        )
    }
    arguments.update(
        (arg, False)
        for arg in (
            "changelog",
            "changelog_to_stdout",
            "no_verify",
            "check_consistency",
            "retry",
            "pre_bump_hooks",
            "post_bump_hooks",
        )
    )
    bump_cmd = commands.Bump(config=conf, arguments=arguments)

    compare_ref = parsed_args.compare_ref
    if compare_ref is None:
        # Reproduce last version lookup from `commitizen.commands.bump.Bump.__call__()`:
        current_version = bump_cmd.config.settings["version"]
        tag_format = bump_cmd.bump_settings["tag_format"]
        compare_ref = bump.normalize_tag(
            current_version, tag_format=tag_format
        )

    # Only check if commits require a bump:
    commits = git.get_commits(compare_ref)
    increment = bump_cmd.find_increment(commits)

    if increment is not None:
        # Yes, a version bump is required by the conventional commits.
        print(increment)
        sys.exit(0)
    exc_value = exceptions.NoCommitsFoundError(
        "[NO_COMMITS_FOUND]\n"
        "No commits found to generate a pre-release.\n"
        "To avoid this error, manually specify the type of increment with `--increment`"
    )
    exc_value.output_method(exc_value.message)
    sys.exit(exc_value.exit_code)


main.__doc__ = __doc__


if __name__ == "__main__":
    main()
