#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""The script to generate a cleanup script after setup.sh.

This script takes a set of flags, telling it what setup.sh changed
during the set up process. Based on the values of the input flags, it
generates a cleanup script, named ${BOARD}_cleanup.sh, which will
undo the changes made by setup.sh, returning everything to its
original state.
"""


import argparse
import sys


def Usage(parser, msg):
    print("ERROR: " + msg)
    parser.print_help()
    sys.exit(1)


def Main(argv):
    """Generate a script to undo changes done by setup.sh

    The script setup.sh makes a change that needs to be
    undone, namely it creates a soft link making /build/${board} point
    to /build/${board}.work.  To do this, it had to see if
    /build/${board} already existed, and if so, whether it was a real
    tree or a soft link.  If it was soft link, it saved the old value
    of the link, then deleted it and created the new link.  If it was
    a real tree, it renamed the tree to /build/${board}.save, and then
    created the new soft link.  If the /build/${board} did not
    previously exist, then it just created the new soft link.

    This function takes arguments that tell it exactly what setup.sh
    actually did, then generates a script to undo those exact changes.
    """

    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--board",
        dest="board",
        required=True,
        help="Chromeos board for packages/image.",
    )

    parser.add_argument(
        "--old_tree_missing",
        dest="tree_existed",
        action="store_false",
        help="Did /build/${BOARD} exist.",
        default=True,
    )

    parser.add_argument(
        "--renamed_tree",
        dest="renamed_tree",
        action="store_true",
        help="Was /build/${BOARD} saved & renamed.",
        default=False,
    )

    parser.add_argument(
        "--old_link",
        dest="old_link",
        help=("The original build tree soft link."),
    )

    options = parser.parse_args(argv[1:])

    if options.old_link or options.renamed_tree:
        if not options.tree_existed:
            Usage(
                parser,
                "If --tree_existed is False, cannot have "
                "--renamed_tree or --old_link",
            )

    if options.old_link and options.renamed_tree:
        Usage(parser, "--old_link and --renamed_tree are incompatible options.")

    if options.tree_existed:
        if not options.old_link and not options.renamed_tree:
            Usage(
                parser,
                "If --tree_existed is True, then must have either "
                "--old_link or --renamed_tree",
            )

    out_filename = "cros_pkg/" + options.board + "_cleanup.sh"

    with open(out_filename, "w", encoding="utf-8") as out_file:
        out_file.write("#!/bin/bash\n\n")
        # First, remove the 'new' soft link.
        out_file.write("sudo rm /build/%s\n" % options.board)
        if options.tree_existed:
            if options.renamed_tree:
                # Old build tree existed and was a real tree, so it got
                # renamed.  Move the renamed tree back to the original tree.
                out_file.write(
                    "sudo mv /build/%s.save /build/%s\n"
                    % (options.board, options.board)
                )
            else:
                # Old tree existed and was already a soft link.  Re-create the
                # original soft link.
                original_link = options.old_link
                if original_link[0] == "'":
                    original_link = original_link[1:]
                if original_link[-1] == "'":
                    original_link = original_link[:-1]
                out_file.write(
                    "sudo ln -s %s /build/%s\n" % (original_link, options.board)
                )
        out_file.write("\n")
        # Remove common.sh file
        out_file.write("rm common/common.sh\n")

    return 0


if __name__ == "__main__":
    retval = Main(sys.argv)
    sys.exit(retval)
