#!/usr/bin/env fuchsia-vendored-python

# Copyright 2019 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 os
import sys
import pathlib


def main():
    parser = argparse.ArgumentParser(
        "Verifies that all .dart files are included in sources, and sources don't include nonexsitent files"
    )
    parser.add_argument(
        "--source_dir",
        help="Path to the directory containing the package sources",
        required=True,
    )
    parser.add_argument(
        "--stamp",
        help="File to touch when source checking succeeds",
        required=True,
    )
    parser.add_argument(
        "sources", help="source files", nargs=argparse.REMAINDER
    )
    args = parser.parse_args()

    actual_sources = set()
    # Get all dart sources from source directory.
    src_dir_path = pathlib.Path(args.source_dir)
    for dirpath, dirnames, filenames in os.walk(src_dir_path, topdown=True):
        relpath_to_src_root = pathlib.Path(dirpath).relative_to(src_dir_path)
        actual_sources.update(
            os.path.normpath(relpath_to_src_root.joinpath(filename))
            for filename in filenames
            if pathlib.Path(filename).suffix == ".dart"
        )

    expected_sources = set(args.sources)
    # It is possible for sources to include dart files outside of source_dir.
    actual_sources.update(
        [
            s
            for s in (expected_sources - actual_sources)
            if src_dir_path.joinpath(s).resolve().exists()
        ],
    )

    if actual_sources == expected_sources:
        with open(args.stamp, "w") as stamp:
            stamp.write("Success!")
        return 0

    def sources_to_abs_path(sources):
        return sorted(str(src_dir_path.joinpath(s)) for s in sources)

    missing_sources = actual_sources - expected_sources
    if missing_sources:
        print(
            '\nSource files found that were missing from the "sources" parameter:\n{}\n'.format(
                "\n".join(sources_to_abs_path(missing_sources))
            ),
        )
    nonexistent_sources = expected_sources - actual_sources
    if nonexistent_sources:
        print(
            '\nSource files listed in "sources" parameter but not found:\n{}\n'.format(
                "\n".join(sources_to_abs_path(nonexistent_sources))
            ),
        )
    return 1


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