# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import argparse
import os
import re
import shutil

from run_operations import run_git, run_shell

# This script fetches the moz-libwebrtc github repro with the expected
# upstream remote and branch-heads setup.  This is used by both the
# prep_repo.sh script as well as the restore_patch_stack.py script.
#
# For speed and conservation of network resources, after fetching all
# the data, a tar of the repo is made and used if available.


def fetch_repo(github_path, force_fetch, tar_path):
    capture_output = False

    # check for pre-existing repo - make sure we force the removal
    if force_fetch and os.path.exists(github_path):
        print("Removing existing repo: {}".format(github_path))
        shutil.rmtree(github_path)

    # clone https://github.com/mozilla/libwebrtc
    if not os.path.exists(github_path):
        # check for pre-existing tar, use it if we have it
        if os.path.exists(tar_path):
            print("Using tar file to reconstitute repo")
            cmd = "cd {} ; tar --extract --gunzip --file={}".format(
                os.path.dirname(github_path), os.path.basename(tar_path)
            )
            run_shell(cmd, capture_output)
        else:
            print("Cloning github repo")
            run_shell(
                "git clone https://github.com/mozilla/libwebrtc {}".format(github_path),
                capture_output,
            )

    # setup upstream (https://webrtc.googlesource.com/src)
    stdout_lines = run_git("git config --local --list", github_path)
    stdout_lines = [
        path for path in stdout_lines if re.findall("^remote.upstream.url.*", path)
    ]
    if len(stdout_lines) == 0:
        print("Fetching upstream")
        run_git("git checkout master", github_path)
        run_git(
            "git remote add upstream https://webrtc.googlesource.com/src", github_path
        )
        run_git("git fetch upstream", github_path)
        run_git("git merge upstream/master", github_path)
    else:
        print(
            "Upstream remote (https://webrtc.googlesource.com/src) already configured"
        )

    # setup upstream branch-heads
    stdout_lines = run_git(
        "git config --local --get-all remote.upstream.fetch", github_path
    )
    if len(stdout_lines) == 1:
        print("Fetching upstream branch-heads")
        run_git(
            "git config --local --add remote.upstream.fetch +refs/branch-heads/*:refs/remotes/branch-heads/*",
            github_path,
        )
        run_git("git fetch upstream", github_path)
    else:
        print("Upstream remote branch-heads already configured")

    # do a sanity fetch in case this was not a freshly cloned copy of the
    # repo, meaning it may not have all the mozilla branches present.
    run_git("git fetch --all", github_path)

    # create tar to avoid time refetching
    if not os.path.exists(tar_path):
        print("Creating tar file for quicker restore")
        cmd = "cd {} ; tar --create --gzip --file={} {}".format(
            os.path.dirname(github_path),
            os.path.basename(tar_path),
            os.path.basename(github_path),
        )
        run_shell(cmd, capture_output)


if __name__ == "__main__":
    default_state_dir = ".moz-fast-forward"
    default_tar_name = "moz-libwebrtc.tar.gz"

    parser = argparse.ArgumentParser(
        description="Restore moz-libwebrtc github patch stack"
    )
    parser.add_argument(
        "--repo-path",
        required=True,
        help="path to libwebrtc repo",
    )
    parser.add_argument(
        "--force-fetch",
        action="store_true",
        default=False,
        help="force rebuild an existing repo directory",
    )
    parser.add_argument(
        "--tar-name",
        default=default_tar_name,
        help="name of tar file (defaults to {})".format(default_tar_name),
    )
    parser.add_argument(
        "--state-path",
        default=default_state_dir,
        help="path to state directory (defaults to {})".format(default_state_dir),
    )
    args = parser.parse_args()

    fetch_repo(
        args.repo_path, args.force_fetch, os.path.join(args.state_path, args.tar_name)
    )
