# Copyright 2022 The Pigweed Authors
#
# 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
#
#     https://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.
"""Pigweed Project Builder Common argparse."""

import argparse


def add_project_builder_arguments(
        parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
    """Add ProjectBuilder.main specific arguments."""
    parser.add_argument('-k',
                        '--keep-going',
                        action='store_true',
                        help=('Keep building past the first failure. This is '
                              'equivalent to passing "-k 0" to ninja.'))

    parser.add_argument(
        'default_build_targets',
        nargs='*',
        metavar='target',
        default=[],
        help=('Automatically locate a build directory and build these '
              'targets. For example, `host docs` searches for a Ninja '
              'build directory at out/ and builds the `host` and `docs` '
              'targets. To specify one or more directories, use the '
              '-C / --build_directory option.'))

    parser.add_argument(
        '-C',
        '--build_directory',
        dest='build_directories',
        nargs='+',
        action='append',
        default=[],
        metavar=('directory', 'target'),
        help=('Specify a build directory and optionally targets to '
              'build. `pw watch -C out tgt` is equivalent to `ninja '
              '-C out tgt`'))

    parser.add_argument(
        '-j',
        '--jobs',
        type=int,
        help="Number of cores to use; defaults to Ninja's default")

    parser.add_argument('--debug-logging',
                        action='store_true',
                        help='Enable debug logging.')

    # TODO(b/248257406) Use argparse.BooleanOptionalAction when Python 3.8 is
    # no longer supported.
    parser.add_argument('--banners',
                        action='store_true',
                        default=True,
                        help='Show pass/fail banners.')
    parser.add_argument('--no-banners',
                        action='store_false',
                        dest='banners',
                        help='Hide pass/fail banners.')

    # TODO(b/248257406) Use argparse.BooleanOptionalAction when Python 3.8 is
    # no longer supported.
    parser.add_argument('--colors',
                        action='store_true',
                        default=True,
                        help='Force color output from ninja.')
    parser.add_argument('--no-colors',
                        action='store_false',
                        dest='colors',
                        help="Don't force ninja to use color output.")

    parser.add_argument('--build-system-command',
                        nargs=2,
                        action='append',
                        default=[],
                        dest='build_system_commands',
                        metavar=('directory', 'command'),
                        help='Build system command.')

    parser.add_argument(
        '--run-command',
        action='append',
        default=[],
        help=('Additional build commands to run. These are run before any -C '
              'arguments and may be repeated. For example: '
              "--run-command 'bazel build //pw_cli/...'"
              "--run-command 'bazel test //pw_cli/...'"
              "-C out python.lint python.test"))

    return parser
