#!/usr/bin/env python

import os
import os.path
import subprocess


IGNORE = subprocess.DEVNULL

EXERCISES_PATH = "exercises"
ANSWERS_PATH = "answers"
PATCHES_PATH = "patches/patches"


# Heals all the exercises.
def heal():
    maketree(ANSWERS_PATH)

    with os.scandir(EXERCISES_PATH) as it:
        for entry in it:
            name = entry.name

            original_path = entry.path
            patch_path = os.path.join(PATCHES_PATH, patch_name(name))
            output_path = os.path.join(ANSWERS_PATH, name)

            patch(original_path, patch_path, output_path)


def main():
    heal()

    with os.scandir(EXERCISES_PATH) as it:
        for entry in it:
            name = entry.name

            broken_path = entry.path
            healed_path = os.path.join(ANSWERS_PATH, name)
            patch_path = os.path.join(PATCHES_PATH, patch_name(name))

            with open(patch_path, "w") as file:
                term = subprocess.run(
                    ["diff", broken_path, healed_path],
                    stdout=file,
                    text=True,
                )
                assert term.returncode == 1


def maketree(path):
    return os.makedirs(path, exist_ok=True)


# Returns path with the patch extension.
def patch_name(path):
    name, _ = os.path.splitext(path)

    return name + ".patch"


# Applies patch to original, and write the file to output.
def patch(original, patch, output):
    subprocess.run(
        ["patch", "-i", patch, "-o", output, original], stdout=IGNORE, check=True
    )


main()