#!/usr/bin/env fuchsia-vendored-python
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Remove host tools that do not belong to a specific host CPU architecture
From SDK archive manifest."""

import argparse
import errno
import json
import os
import shutil
import sys

_HOST_CPUS = ("x64", "arm64")


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        "--host_cpu",
        required=True,
        choices=_HOST_CPUS,
        help="Host CPU architecture name",
    )
    parser.add_argument(
        "--input",
        type=argparse.FileType("r"),
        required=True,
        help="Input API manifest file",
    )
    parser.add_argument(
        "--output",
        type=argparse.FileType("w"),
        required=True,
        help="Output API manifest file",
    )
    parser.add_argument(
        "--host-tool-prefix",
        required=True,
        help="Line prefix for SDK host tool",
    )

    args = parser.parse_args()

    # Any line that begins with this prefix is a candidate for rejection.
    candidate_line_prefix = args.host_tool_prefix

    # Any candidate line that begins with this prefix is accepted, all others
    # are rejected.
    accepted_line_prefix = candidate_line_prefix + args.host_cpu + "/"

    for line in args.input:
        if line.startswith(candidate_line_prefix) and not line.startswith(
            accepted_line_prefix
        ):
            continue
        args.output.write(line)

    return 0


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