#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# See https://github.com/domokit/sky_engine/wiki/Release-process

import argparse
import os
import subprocess
import sys
import distutils.util


DRY_RUN = False


def run(cwd, args):
    print 'RUNNING:', ' '.join(args), 'IN:', cwd
    if DRY_RUN:
        return
    subprocess.check_call(args, cwd=cwd)


def confirm(prompt):
    user_input = raw_input("%s (y/N) " % prompt)
    try:
        return distutils.util.strtobool(user_input) == 1
    except ValueError:
        return False


def git_revision(cwd):
    return subprocess.check_output([
        'git', 'rev-parse', 'HEAD',
    ], cwd=cwd).strip()


class Artifact(object):
    def __init__(self, category, name):
        self.category = category
        self.name = name


GS_URL = 'gs://mojo/sky/%(category)s/%(config)s/%(commit_hash)s/%(name)s'


ARTIFACTS = {
    'android-arm': [
        Artifact('shell', 'SkyShell.apk'),
        Artifact('viewer', 'sky_viewer.mojo'),
        Artifact('viewer', 'libsky_viewer_library.so'),
    ],
    'linux-x64': [
        Artifact('shell', 'icudtl.dat'),
        Artifact('shell', 'sky_shell'),
        Artifact('shell', 'sky_snapshot'),
        Artifact('viewer', 'sky_viewer.mojo'),
        Artifact('viewer', 'libsky_viewer_library.so'),
    ]
}


def upload_artifacts(dist_root, config, commit_hash):
    for artifact in ARTIFACTS[config]:
        src = os.path.join(artifact.category, artifact.name)
        dst = GS_URL % {
            'category': artifact.category,
            'config': config,
            'commit_hash': commit_hash,
            'name': artifact.name,
        }
        z = ','.join([ 'mojo', 'dat' ])
        run(dist_root, ['gsutil', 'cp', '-z', z, src, dst])


def main():
    parser = argparse.ArgumentParser(description='Deploy!')
    parser.add_argument('--dry-run', action='store_true', default=False,
        help='Just print commands w/o executing.')
    parser.add_argument('--revision', help='The git revision to publish.')
    args = parser.parse_args()

    global DRY_RUN
    DRY_RUN = args.dry_run

    engine_root = os.path.abspath('.')
    if not os.path.exists(os.path.join(engine_root, 'sky')):
        print "Cannot find //sky. Is %s the Flutter engine repository?" % engine_root
        return 1

    commit_hash = git_revision(engine_root)

    if commit_hash != args.revision:
        print "Current revision %s does not match requested revision %s." % (commit_hash, args.revision)
        print "Please update the current revision to %s." % args.revision
        return 1

    # Derived paths:
    dart_sdk_root = os.path.join(engine_root, 'third_party/dart-sdk/dart-sdk')
    pub_path = os.path.join(dart_sdk_root, 'bin/pub')
    android_dist_root = os.path.join(engine_root, 'out/android_Release/dist')
    linux_dist_root = os.path.join(engine_root, 'out/Release/dist')
    sky_engine_package_root = os.path.join(android_dist_root, 'packages/sky_engine/sky_engine')
    sky_services_package_root = os.path.join(android_dist_root, 'packages/sky_services/sky_services')
    sky_engine_revision_file = os.path.join(sky_engine_package_root, 'lib', 'REVISION')

    run(engine_root, ['sky/tools/gn', '--android', '--release'])
    run(engine_root, ['ninja', '-C', 'out/android_Release', ':dist'])

    run(engine_root, ['sky/tools/gn', '--release'])
    run(engine_root, ['ninja', '-C', 'out/Release', ':dist'])

    with open(sky_engine_revision_file, 'w') as stream:
        stream.write(commit_hash)

    upload_artifacts(android_dist_root, 'android-arm', commit_hash)
    upload_artifacts(linux_dist_root, 'linux-x64', commit_hash)

    run(sky_engine_package_root, [pub_path, 'publish', '--force'])
    run(sky_services_package_root, [pub_path, 'publish', '--force'])


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