# Copyright 2023 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.
"""Implementation of `pw build` for Gonk."""

import logging
from pathlib import Path
import shutil
import sys

from pw_build.build_recipe import (
    BuildCommand,
    BuildRecipe,
)
from pw_build.project_builder_presubmit_runner import (
    main,
    should_gn_gen_with_args,
)
from pw_presubmit.build import gn_args

_LOG = logging.getLogger('pw_build')

_ENABLE_FPGA_BUILD = (
    shutil.which('nextpnr-ice40')
    and shutil.which('yosys')
    and shutil.which('icepack')
    and shutil.which('icetime')
)


def build_project(force_pw_watch: bool = False) -> int:
    """Use pw_build to compile Gonk.

    Defines BuildRecipes and passes them to Pigweed's
    project_builder_presubmit_runner.main to start a ``pw build`` invocation.

    Returns:
      An int representing the success or failure status of the build; 0 if
      successful, 1 if failed.

    Command line usage examples:

    .. code-block:: bash
       pw build --list
       pw build --recipe default
       pw build -C out --watch
    """

    default_gn_gen_command = [
        'gn',
        'gen',
        '{build_dir}',
        '--export-compile-commands',
    ]

    default_gn_args: dict[str, str] = {}

    default_gn_gen_command.append(gn_args(**default_gn_args))

    default_targets = ['default']
    if _ENABLE_FPGA_BUILD:
        # Build the FPGA image, gonk tools bundle, and pip install the
        # gonk_firmware package into the bootstrap venv.
        default_targets += ['fpga', 'gonk_bundle', 'pip_install_gonk_firmware']
    else:
        _LOG.warning(
            'FPGA build disabled. The following tools were not found: '
            'icepack, icetime, nextpnr-ice40, yosys.'
        )

    default_build_steps = [
        BuildCommand(
            run_if=should_gn_gen_with_args(default_gn_args),
            command=default_gn_gen_command,
        ),
        BuildCommand(
            build_system_command='ninja',
            targets=default_targets,
        ),
    ]

    build_recipes = [
        BuildRecipe(
            build_dir=Path('out/gn'),
            title='default',
            steps=default_build_steps,
        ),
    ]

    # This project doesn't pass forward presubmit steps as they introduce some
    # clutter that is more likely to get in the way rather than help users.
    # If more comprehensive presubmit programs are added, they should be added
    # to `presubmit_programs` here.
    return main(
        build_recipes=build_recipes,
        default_build_recipe_names=['default'],
        default_root_logfile=Path('out/build.txt'),
        force_pw_watch=force_pw_watch,
    )


def watch_project() -> int:
    """Use ``pw watch`` to build this project."""
    sys.exit(build_project(force_pw_watch=True))


if __name__ == '__main__':
    sys.exit(build_project())
