#! /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',
        os.path.join(*'out/skqp/gmkb'.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'))
