#!/usr/bin/env python
# Copyright 2014 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.

from skypy.find_tests import find_tests
from skypy.paths import Paths
import argparse
import os
import re
import requests
import skypy.configuration as configuration
import subprocess


SUPPORTED_MIME_TYPES = [
    'text/html',
    'text/sky',
    'text/plain',
]
HTTP_PORT = 9999
URL_ROOT = 'http://localhost:%s/' % HTTP_PORT
DASHBOARD_URL = 'https://chromeperf.appspot.com/add_point'
BENCHMARKS_DIR = 'benchmarks'


def values_from_output(output):
    # Parse out the raw values from the PerfRunner output:
    #   values 90, 89, 93 ms
    # We'll probably need a fancier parser at some point.
    match = re.search(r'values (.+) ms', output, flags=re.MULTILINE)
    return map(float, match.group(1).split(', '))


def create_json_blob(values):
    revision = subprocess.check_output(["git", "show-ref", "HEAD", "-s"]).strip()
    return {
        "master": "master.mojo.perf",
        "bot": "sky-release",
        "point_id": 123456, # FIXME: We need to generate a monotonicly increasing number somehow.
        "versions": {
          "mojo": revision
        },
        "chart_data": {
            "format_version": "1.0",
            "benchmark_name": "layout.simple-blocks",
            "charts": {
                "warm_times": {
                    "traces": {
                        "layout.simple-blocks": {
                            "type": "list_of_scalar_values",
                            "values": values,
                        },
                    }
                }
            }
        }
    }


def send_json_to_dashboard(json):
    requests.post(DASHBOARD_URL, params={ 'data': json })


class PerfHarness(object):
    def __init__(self, args):
        self._sky_server = None
        self.paths = Paths(os.path.join('out', 'Debug'))
        self.args = args

    def _start_server(self):
        subprocess.call(os.path.join(self.paths.sky_tools_directory,
            'download_sky_server'))
        return subprocess.Popen([
            os.path.join(self.paths.src_root, 'out', 'downloads', 'sky_server'),
            self.paths.src_root,
            str(HTTP_PORT),
            '-t', self.args.configuration
        ])

    def _sky_tester_command(self, url):
        content_handlers = ['%s,%s' % (mime_type, 'mojo:sky_viewer')
            for mime_type in SUPPORTED_MIME_TYPES]
        return [
            self.paths.mojo_shell_path,
            '--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa',
            '--args-for=mojo:window_manager %s' % url,
            '--content-handlers=%s' % ','.join(content_handlers),
            '--url-mappings=mojo:window_manager=mojo:sky_tester',
            'mojo:window_manager',
        ]

    def _url_for_path(self, path):
        return URL_ROOT + os.path.relpath(path, self.paths.src_root)

    def _run_tests(self, path):
        url = self._url_for_path(path)
        output = subprocess.check_output(
            self._sky_tester_command(url),
            stderr=subprocess.STDOUT)
        values = values_from_output(output)
        print os.path.basename(path), "=>", values
        # FIXME: Upload JSON blob to results server:
        # json = create_json_blob(values)
        # send_json_to_dashboard(json)

    def main(self):
        self._start_server()
        map(self._run_tests, find_tests(os.path.join(self.paths.sky_root, BENCHMARKS_DIR)))

    def shutdown(self):
        if self._sky_server:
            self._sky_server.terminate()


def main():
    parser = argparse.ArgumentParser(description='Sky performance tester')
    configuration.add_arguments(parser)
    args = parser.parse_args()

    harness = PerfHarness(args)
    try:
        harness.main()
    except (KeyboardInterrupt, SystemExit):
        pass
    finally:
        harness.shutdown()


if __name__ == '__main__':
    main()
