#!/usr/bin/env python3
#
# Copyright (c) 2024 Raspberry Pi (Trading) Ltd.
#
# SPDX-License-Identifier: BSD-3-Clause
#
# Runs all Bazel checks.

import argparse
import sys

from bazel_build import build_all_configurations
from bazel_common import (
    setup_logging,
    print_framed_string,
    print_to_stderr,
    add_common_args,
)
from compare_build_systems import compare_build_systems
from check_source_files_in_bazel_build import check_sources_in_bazel_build
from bazel_buildifier_lint_check import check_buildifier


def main():
    setup_logging()
    failed_steps = []

    parser = argparse.ArgumentParser()
    add_common_args(parser)
    parser.add_argument(
        "--program",
        help="A program to run",
        choices = [
            "all",
            "build",
            "other",
        ],
        default="all",
    )
    args = parser.parse_args()
    build_steps = (
        {
            "step_name": "build",
            "description": "Bazel build",
            "action": lambda : build_all_configurations(args.picotool_dir),
        },
    )
    other_steps = (
        {
            "description": "Ensure build system configurations options match",
            "action": compare_build_systems,
        },
        {
            "step_name": "check_srcs_in_build",
            "description": "Ensure source files are present in Bazel build",
            "action": lambda : check_sources_in_bazel_build(args.picotool_dir),
        },
        {
            "step_name": "check_buildifier",
            "description": "Run buildifier check",
            "action": check_buildifier,
        },
    )
    steps_to_run = []
    run_all_steps = args.program == "all"
    if args.program == "build" or run_all_steps:
        steps_to_run.extend(build_steps)
    if args.program == "other" or run_all_steps:
        steps_to_run.extend(other_steps)

    for step in steps_to_run:
        print_framed_string(f"{step['description']}...")
        returncode = step["action"]()
        if returncode != 0:
            failed_steps.append(step["description"])
        print_to_stderr()

    if failed_steps:
        print_framed_string("ERROR: One or more steps failed.")
        for build in failed_steps:
            print_to_stderr(f"  * FAILED: {build}")
        return 1

    print_framed_string("All checks successfully passed!")


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