#!/usr/bin/env python2.7
# Copyright 2019 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.

import argparse
import fileinput
import os
import re
import shutil
import sys

from common import (FUCHSIA_ROOT, run_command, is_tree_clean, fx_format)


def main():
    parser = argparse.ArgumentParser(
            description='Moves a Banjo library from //zircon to //sdk')
    parser.add_argument('lib',
                        help='Name of the library to migrate')
    args = parser.parse_args()
    lib = args.lib

    # Check that the fuchsia.git tree is clean.
    if not is_tree_clean():
        return 1

    sdk_base = os.path.join(FUCHSIA_ROOT, 'sdk', 'banjo')
    sdk_dir = os.path.join(sdk_base, lib)
    banjo_base = os.path.join(FUCHSIA_ROOT, 'zircon', 'system', 'banjo')
    source_dir = os.path.join(banjo_base, lib)

    # Move the sources.
    shutil.move(source_dir, sdk_base)

    # Edit the build file.
    is_dummy = not (lib.startswith('ddk.protocol') or lib.startswith('ddk.hw'))
    build_path = os.path.join(sdk_dir, 'BUILD.gn')
    for line in fileinput.FileInput(build_path, inplace=True):
        line = line.replace('$zx_build/public/gn/banjo.gni',
                            '//build/banjo/banjo.gni')
        line = line.replace('banjo_library',
                            'banjo_dummy' if is_dummy else 'banjo')
        line = line.replace('public_deps',
                            'deps')
        line = line.replace('$zx/system/banjo',
                            '//zircon/system/banjo')
        sys.stdout.write(line)
    fx_format(build_path)

    # Edit references to the library.
    for base, _, files in os.walk(FUCHSIA_ROOT):
        for file in files:
            if file != 'BUILD.gn':
                continue
            file_path = os.path.join(base, file)
            has_changes = False
            for original_line in fileinput.FileInput(file_path, inplace=True):
                # Make sure that only exact matches are replaced, as some
                # library names are prefix of other names.
                # Examples:
                # //zircon/s/b/ddk.foo.bar" --> "//sdk/b/foo.bar"
                # //zircon/s/b/ddk.foo.bar:boop" --> "//sdk/b/foo.bar:boop"
                line = re.sub('"(//zircon/system/banjo/' + lib + ')([:"])',
                              '"//sdk/banjo/' + lib + '\\2',
                              original_line)
                if line != original_line:
                    has_changes = True
                sys.stdout.write(line)
            if has_changes:
                fx_format(file_path)

    for line in fileinput.FileInput(os.path.join(banjo_base, 'BUILD.gn'),
                                    inplace=True):
        if not '"' + lib + '"' in line:
            sys.stdout.write(line)

    # Create a commit.
    run_command(['git', 'checkout', '-b', 'banjo-move-' + lib, 'JIRI_HEAD'])
    run_command(['git', 'add', sdk_dir])
    message = [
        '[unification] Move ' + lib + ' to //sdk/banjo',
        '',
        'Generated with: //scripts/unification/move_banjo_library.py ' + lib,
        '',
        'Bug: 36540'
    ]
    commit_command = ['git', 'commit', '-a']
    for line in message:
        commit_command += ['-m', line]
    run_command(commit_command)

    print('Change is ready, use "jiri upload" to start the review process.')

    return 0


if __name__ == '__main__':
    sys.exit(main())
