#! /usr/bin/env python

# Copyright 2018 Google Inc.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import subprocess
import tempfile
import sys

def skqp(build):
    def adb(*args):
        sys.stdout.write("adb '" + "' '".join(args) + "'\n")
        subprocess.check_call(['adb'] + list(args))

    assert os.path.isdir(build)
    build = os.path.abspath(build)

    os.chdir(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))

    adb('shell', 'rm -rf /data/local/tmp/skqp; mkdir -p /data/local/tmp/skqp/skqp_assets')

    adb('push',
        os.path.join(*'platform_tools/android/apps/skqp/src/main/assets/skqp'.split('/')),
        '/data/local/tmp/skqp/skqp_assets')
    adb('push', 'resources', '/data/local/tmp/skqp/skqp_assets')

    adb('push', os.path.join(build, 'skqp'), '/data/local/tmp/skqp/skqp')

    cmd = "cd /data/local/tmp/skqp; ./skqp skqp_assets report"
    sys.stdout.write("adb 'shell' '%s'\n" % cmd)
    ret = subprocess.call(['adb', 'shell', cmd])

    tmpdir = tempfile.mkdtemp(prefix='skqp')

    adb('pull', "/data/local/tmp/skqp/report", tmpdir)

    return ret, os.path.join(tmpdir, 'report')

if __name__ == '__main__':
    if len(sys.argv) != 2 or not os.path.isdir(sys.argv[1]):
        sys.stderr.write('Usage\n  %s BUILD_DIR\n\n' % sys.argv[0])
        sys.exit(1)
    try:
        ret, report = skqp(sys.argv[1])
    except subprocess.CalledProcessError:
        sys.stderr.write('Command failed.\n')
        sys.exit(1)

    sys.stdout.write('\nReturn code: %d\nOutput written to "%s"\n' % (ret, report))
    os.system("bin/sysopen " + os.path.join(report, 'report.html'))
