#!/usr/bin/env python3.8

# 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())
