#!/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 and Python 2 encoding lines must come on the first line, so
        # make sure to not insert copyright notices ahead of those types of
        # lines.
        if orig_lines[0].startswith(("#!", "# -*- coding")):
            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()
