#!/usr/bin/env python
"""Downloads a prebuilt gn binary to a place where gn.py can find it."""

from __future__ import print_function

import os
import urllib2
import sys
import tempfile
import zipfile


def download_url(url, output_file):
    """Download url into output_file."""
    print('downloading %s ...' % url, end='')
    sys.stdout.flush()
    output_file.write(urllib2.urlopen(url).read())
    print(' done')


def download_and_unpack(url, output_dir, gn):
    """Download an archive from url and extract gn from it into output_dir."""
    with tempfile.TemporaryFile() as f:
        download_url(url, f)
        f.seek(0)
        zipfile.ZipFile(f).extract(gn, path=output_dir)


def set_executable_bit(path):
    mode = os.stat(path).st_mode
    mode |= (mode & 0o444) >> 2 # Copy R bits to X.
    os.chmod(path, mode) # No-op on Windows.


def get_platform():
    if os.uname()[4] != 'x86_64':
        return None
    if sys.platform.startswith('linux'):
        return 'linux-amd64'
    if sys.platform == 'darwin':
        return 'mac-amd64'
    if sys.platform == 'win32':
        return 'windows-amd64'


def main():
    platform = get_platform()
    if not platform:
        print('no prebuilt binary for', sys.platform)
        return 1

    dirname = os.path.join(os.path.dirname(__file__), 'bin', platform)
    if not os.path.exists(dirname):
        os.makedirs(dirname)

    url = 'https://chrome-infra-packages.appspot.com/dl/gn/gn/%s/+/latest'
    gn = 'gn' + ('.exe' if sys.platform == 'win32' else '')
    download_and_unpack(url % platform, dirname, gn)
    set_executable_bit(os.path.join(dirname, gn))


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