<!DOCTYPE html>
<!--
Copyright (c) 2015 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.
-->
<link rel="import" href="/perf_insights/function_handle.html">
<link rel="import" href="/perf_insights/map_single_trace.html">
<link rel="import" href="/perf_insights/mre/failure.html">
<link rel="import" href="/perf_insights/mre/file_handle.html">
<link rel="import" href="/perf_insights/mre/job.html">
<link rel="import" href="/perf_insights/mre/mre_result.html">

<script>
'use strict';

tr.exportTo('pi', function() {

  var Failure = pi.mre.Failure;

  function createModelFromTraceData(traceData,
                                    canonicalUrl,
                                    opt_extraImportOptions) {
    var model = new tr.Model();
    try {
      var importOptions = new tr.importer.ImportOptions();
      importOptions.pruneEmptyContainers = false;
      importOptions.showImportWarnings = false;
      if (opt_extraImportOptions !== undefined) {
        for (var property in opt_extraImportOptions) {
          if (opt_extraImportOptions.hasOwnProperty(property)) {
            importOptions[property] = opt_extraImportOptions[property];
          }
        }
      }

      var i = new tr.importer.Import(model, importOptions);
      i.importTraces([traceData]);
    } catch (ex) {
      ex.name = 'TraceImportError';
      throw ex;
    }

    model.canonicalUrlThatCreatedThisTrace = canonicalUrl;

    return model;
  }

  function mapSingleTraceMain(args) {
    if (args.length !== 2 && args.length !== 3)
      throw new Error('Must provide two or three arguments.');

    var options = {
      traceHandle: pi.mre.FileHandle.fromDict(JSON.parse(args[0])),
      job: pi.mre.Job.fromDict(JSON.parse(args[1])),
      extraImportOptions: args.length === 3 ? JSON.parse(args[2]) : undefined
    };

    var result = new pi.mre.MreResult();

    var canonicalUrl = options.traceHandle.canonicalUrl;

    pi.runAndConvertErrorsToFailures(
        result, options.job, options.traceHandle,
        function() {
          var mapFunction = options.job.mapFunctionHandle.load();
          var traceData = options.traceHandle.load();
          var model = createModelFromTraceData(
              traceData, canonicalUrl, options.extraImportOptions);
          var opt_options = options.job.mapFunctionHandle.options;
          pi.mapSingleTrace(result, model, opt_options, mapFunction);
        });

    console.log('MRE_RESULT: ' + JSON.stringify(result.asDict()));
    return 0;
  }

  return {
    mapSingleTraceMain: mapSingleTraceMain
  };
});

if (tr.isHeadless)
  quit(pi.mapSingleTraceMain(sys.argv.slice(1)));

</script>
