#!/usr/bin/env python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import os
import subprocess
import sys

import etlparser
import xtalos
from xperf_analyzer import (
    ProcessStart,
    SessionStoreWindowRestored,
    XPerfAttribute,
    XPerfFile,
    XPerfInterval,
)


def run_session_restore_analysis(debug=False, **kwargs):
    required = ("csv_filename", "outputFile")
    for r in required:
        if r not in kwargs:
            raise xtalos.XTalosError("%s required" % r)

    final_output_file = "%s_session_restore_stats%s" % os.path.splitext(
        kwargs["outputFile"]
    )

    output = "time_to_session_store_window_restored_ms\n"

    with XPerfFile(csvfile=kwargs["csv_filename"], debug=debug) as xperf:
        fx_start = ProcessStart("firefox.exe")
        ss_window_restored = SessionStoreWindowRestored()

        interval = XPerfInterval(fx_start, ss_window_restored)
        xperf.add_attr(interval)

        xperf.analyze()

        results = interval.get_results()
        if results != {}:
            output += "%.3f\n" % (results[XPerfAttribute.RESULT])

    with open(final_output_file, "w") as out:
        out.write(output)

    if debug:
        etlparser.uploadFile(final_output_file)


def stop(xperf_path, debug=False):
    xperf_cmd = [xperf_path, "-stop", "-stop", "talos_ses"]
    if debug:
        print("executing '%s'" % subprocess.list2cmdline(xperf_cmd))
    subprocess.call(xperf_cmd)


def stop_from_config(config_file=None, debug=False, **kwargs):
    """start from a YAML config file"""

    # required options and associated error messages
    required = {
        "xperf_path": "xperf_path not given",
        "etl_filename": "No etl_filename given",
    }
    for key in required:
        if key not in kwargs:
            kwargs[key] = None

    if config_file:
        # override options from YAML config file
        kwargs = xtalos.options_from_config(kwargs, config_file)

    # ensure the required options are given
    for key, msg in required.items():
        if not kwargs.get(key):
            raise xtalos.XTalosError(msg)

    # ensure path to xperf actually exists
    if not os.path.exists(kwargs["xperf_path"]):
        raise xtalos.XTalosError(
            "ERROR: xperf_path '%s' does not exist" % kwargs["xperf_path"]
        )

    # make calling arguments
    stopargs = {}
    stopargs["xperf_path"] = kwargs["xperf_path"]
    stopargs["debug"] = debug

    # call start
    stop(**stopargs)

    etlparser.etlparser_from_config(
        config_file,
        approot=kwargs["approot"],
        error_filename=kwargs["error_filename"],
        processID=kwargs["processID"],
    )

    csv_base = "%s.csv" % kwargs["etl_filename"]
    run_session_restore_analysis(csv_filename=csv_base, debug=debug, **kwargs)

    if not debug:
        os.remove(csv_base)


def main(args=sys.argv[1:]):
    # parse command line arguments
    parser = xtalos.XtalosOptions()
    args = parser.parse_args(args)

    # stop xperf
    try:
        stop_from_config(
            config_file=args.configFile,
            debug=args.debug_level >= xtalos.DEBUG_INFO,
            **args.__dict__
        )
    except xtalos.XTalosError as e:
        parser.error(str(e))


if __name__ == "__main__":
    main()
