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

# This script downloads the latest dev SDK from
# http://gsdview.appspot.com/dart-archive/channels/dev/raw/latest/sdk/
# into tools/sdks/. It is intended to be invoked from Jiri hooks in
# a Fuchsia checkout.

import os
import sys
import zipfile
import urllib
import utils

HOST_OS = utils.GuessOS()
HOST_ARCH = utils.GuessArchitecture()
SCRIPT_DIR = os.path.dirname(sys.argv[0])
DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))

DEFAULT_DART_VERSION = 'latest'
BASE_URL = 'http://gsdview.appspot.com/dart-archive/channels/dev/raw/%s/sdk/%s'


def host_os_for_sdk(host_os):
    if host_os.startswith('macos'):
        return 'mac'
    if host_os.startswith('win'):
        return 'windows'
    return host_os


# Python's zipfile doesn't preserve file permissions during extraction, so we
# have to do it manually.
def extract_file(zf, info, extract_dir):
    try:
        zf.extract(info.filename, path=extract_dir)
        out_path = os.path.join(extract_dir, info.filename)
        perm = info.external_attr >> 16L
        os.chmod(out_path, perm)
    except IOError as err:
        if 'dart-sdk/bin/dart' in err.filename:
            print(
                'Failed to extract the new Dart SDK dart binary. ' +
                'Kill stale instances (like the analyzer) and try the update again'
            )
            return False
        raise
    return True


def main(argv):
    host_os = host_os_for_sdk(HOST_OS)
    zip_file = ('dartsdk-%s-x64-release.zip' % HOST_OS)
    sha_file = zip_file + '.sha256sum'
    sdk_path = os.path.join(DART_ROOT, 'tools', 'sdks')
    local_sha_path = os.path.join(sdk_path, sha_file)
    remote_sha_path = os.path.join(sdk_path, sha_file + '.remote')
    zip_path = os.path.join(sdk_path, zip_file)

    sdk_version = DEFAULT_DART_VERSION
    sha_url = (BASE_URL % (sdk_version, sha_file))
    zip_url = (BASE_URL % (sdk_version, zip_file))

    local_sha = ''
    if os.path.isfile(local_sha_path):
        with open(local_sha_path, 'r') as fp:
            local_sha = fp.read()

    remote_sha = ''
    urllib.urlretrieve(sha_url, remote_sha_path)
    with open(remote_sha_path, 'r') as fp:
        remote_sha = fp.read()
    os.remove(remote_sha_path)

    if local_sha == '' or local_sha != remote_sha:
        print 'Downloading prebuilt Dart SDK from: ' + zip_url
        urllib.urlretrieve(zip_url, zip_path)
        with zipfile.ZipFile(zip_path, 'r') as zf:
            for info in zf.infolist():
                if not extract_file(zf, info, sdk_path):
                    return -1
        with open(local_sha_path, 'w') as fp:
            fp.write(remote_sha)
    return 0


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