import glob
import re
import subprocess

def istext(path):
    return re.search(r':.* text', subprocess.Popen(["file", '-L', path], stdout=subprocess.PIPE).stdout.read().decode()) is not None

paths = glob.glob("**/*", recursive=True)

PREFIXES = [("//", "//", ""), ("#", "#", "")]

fulltext = """
 SPDX-FileCopyrightText: 2020 Anish Singhani

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 SPDX-License-Identifier: Apache-2.0
""".strip()

for path in paths:
    if not istext(path):
        print("Skipping {}...".format(path))
    else:
        print("Checking {}...".format(path))
        with open(path, "r") as f:
            lines = f.readlines()

        if len(lines) > 3 and "SPDX-FileCopyrightText: 2020 Efabless Corporation" in lines[0]+lines[1]+lines[2]:
            print("Efabless SPDX found")

        elif len(lines) > 3 and "SPDX-FileCopyrightText: 2020 Anish Singhani" in lines[0]+lines[1]+lines[2]:
            print("Correct SPDX found")

        else:
            if len(lines) > 3 and ("Copyright" in lines[0] or "Copyright" in lines[1] or "Copyright" in lines[2]):
                ans = ""
                while ans not in ["y", "n"]:
                    ans = input("Partial identifier found. Fix [y/n]? ").lower()

                if ans == "y":
                    if "Copyright" in lines[0]:
                        offset = 0
                    elif "Copyright" in lines[1]:
                        offset = 1
                    elif "Copyright" in lines[2]:
                        offset = 2

                    lines2 = lines[:offset]
                    lines = lines[offset:]

                    lines[0] = lines[0][:lines[0].index("Copyright")] + "SPDX-FileCopyrightText: 2020 Anish Singhani\n"

                    lines.pop(1)
                    lines.pop(1)

                    license_ind = min(i for i, e in enumerate(lines) if "limitations under the License" in e)

                    lines.insert(license_ind+1, lines[license_ind].replace("limitations under the License.", "SPDX-License-Identifier: Apache-2.0"))

                    lines = lines2 + lines

                    with open(path, "w") as f:
                        f.write("".join(lines) + "\n")
                    print("Fixed")
                else:
                    print("Leaving as-is")

            else:
                ans = ""
                while ans not in list(map(str, range(len(PREFIXES)))) + ["n"]:
                    ans = input("No identifier found. ("+(",".join(x[0] for x in PREFIXES))+") Add ["+("/".join(map(str, range(len(PREFIXES)))))+"/n]? ").lower()

                if ans != "n":
                    i = int(ans)
                    prefix = PREFIXES[i][1]
                    pre_lines = [prefix + x + "\n" for x in fulltext.splitlines()]
                    lines = pre_lines + lines

                    with open(path, "w") as f:
                        f.write("".join(lines) + "\n")

                    print("Fixed")
                else:
                    print("Leaving as-is")

