#!/usr/bin/env fuchsia-vendored-python
"""Merges sources of a Dart target and its dependencies"""

# Copyright 2021 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.

import argparse
import json
import os
import sys


def main():
    parser = argparse.ArgumentParser(
        "Merges sources of a Dart target and its dependencies",
        fromfile_prefix_chars="@",
    )
    parser.add_argument(
        "--output",
        help="Path to output the final list",
        type=argparse.FileType("w"),
        required=True,
    )
    parser.add_argument(
        "--depfile",
        help="Path to the depfile to generate",
        type=argparse.FileType("w"),
        required=True,
    )
    parser.add_argument(
        "--sources",
        help="Sources of this target",
        nargs="*",
    )
    parser.add_argument(
        "--source_lists",
        help="Files containing lists of Dart sources",
        nargs="*",
    )
    args = parser.parse_args()

    args.depfile.write(
        "{}: {}\n".format(args.output.name, " ".join(args.source_lists))
    )

    # Merges sources of this target, and all of its dependencies.
    all_sources = set(args.sources)
    for f in args.source_lists:
        with open(f, "r") as f:
            all_sources.update(json.load(f))
    json.dump(sorted(all_sources), args.output)


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