#!/usr/bin/env python
# Copyright 2020 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.
"""This script finds all Python recipe files that are missing a copyright
notice and adds a copyright, modifying the files in-place."""

import datetime
import os

COPYRIGHT = (
    """# Copyright %s 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.
"""
    % datetime.datetime.now().year
)


def main():
    cwd = os.getcwd()
    recipe_dirs = [os.path.join(cwd, "recipes"), os.path.join(cwd, "recipe_modules")]
    for directory in recipe_dirs:
        for subdir, _, files in os.walk(directory):
            for relpath in files:
                _, ext = os.path.splitext(relpath)
                if ext != ".py":
                    continue
                path = os.path.join(subdir, relpath)
                ensure_copyright(path)


def ensure_copyright(path):
    with open(path, "r") as f:
        orig_lines = f.readlines()

    add_copyright = False
    copyright_line_index = 0
    if orig_lines:
        # shebangs must come on the first line, so make sure to not insert
        # copyright notices ahead of a shebang.
        if orig_lines[0].startswith("#!"):
            copyright_line_index = 1
        if len(orig_lines) <= 1 or not orig_lines[copyright_line_index].startswith(
            "# Copyright"
        ):
            add_copyright = True
    else:
        add_copyright = True

    if not add_copyright:
        return

    copyright_lines = [l + "\n" for l in COPYRIGHT.splitlines()]

    # Ensure there's a blank line between the copyright statement the next
    # line, if the next line isn't a docstring.
    if copyright_line_index < len(orig_lines):
        next_line = orig_lines[copyright_line_index]
        if next_line.strip() != "" and not next_line.startswith(('"""', "'''")):
            copyright_lines.append("\n")

    with open(path, "w") as f:
        new_lines = orig_lines[:]
        new_lines[copyright_line_index:copyright_line_index] = copyright_lines
        f.write("".join(new_lines))


if __name__ == "__main__":
    main()
