<!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="/tracing/base/base.html">
<link rel="import" href="/tracing/base/utils.html">
<link rel="import" href="/tracing/base/xhr.html">
<link rel="import" href="/tracing/model/model.html">
<link rel="import" href="/tracing/extras/full_config.html">

<link rel="import" href="/perf_insights/value/value.html">
<link rel="import" href="/perf_insights/map_function.html">

<script>
'use strict';

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

  var currentRunID = undefined;
  var FailureValue = pi.v.FailureValue;

  function mapSingleTrace(results, options) {
    try {
      currentRunID = options.run_info.run_id;
      mapSingleTraceImpl(results, options);
    } finally {
      currentRunID = undefined;
    }
  }

  function mapSingleTraceImpl(results, options) {
    // Load the mapper.
    var allTypeInfos = pi.MapFunction.getAllRegisteredTypeInfos();
    try {
      var numTypeInfosBefore = allTypeInfos.length;
      loadHTMLFile(options.map_file, options.map_file);
    } catch (ex) {
      var ex = tr.b.normalizeException(ex);
      results.addValue(new FailureValue(
          options.run_info, 'MapFunctionLoadingError',
          {description: ex.message, stack: ex.stack}));
      return;
    } finally {
      if (numTypeInfosNow !== numTypeInfosBefore) {
      }
    }

    // Verify a mapFunction was defined.
    var numTypeInfosNow = allTypeInfos.length;
    if (numTypeInfosNow !== (numTypeInfosBefore + 1)) {
      results.addValue(new FailureValue(
          options.run_info, 'MapFunctionNotDefinedError',
          {description: options.map_file + ' did not call defineMapFunction',
           stack: tr.b.stackTraceAsString()}));
      return;
    }

    var mapFunction = allTypeInfos[allTypeInfos.length - 1].constructor;

    // Data.
    try {
      var traceData = tr.b.getSync('file://' + options.filename_to_map);
    } catch (ex) {
      results.addValue(new FailureValue(
          options.run_info, 'TraceImportError',
          {description: 'Could not open ' + options.filename_to_map,
           stack: tr.b.stackTraceAsString()}));
      return;
    }

    // Load the model.
    var importOptions = new tr.ImportOptions();
    importOptions.pruneEmptyContainers = false;
    importOptions.showImportWarnings = false;
    var model = new tr.Model();
    try {
      model.importTraces([traceData], importOptions);
    } catch (ex) {
      var ex = tr.b.normalizeException(ex);
      results.addValue(new FailureValue(
          options.run_info, 'TraceImportError',
          {description: ex.message, stack: ex.stack}));
      return;
    }

    // Mixin the metadata in case its interesting to the mapper.
    for (var k in options.metadata) {
      if (model.metadata[k] !== undefined) {
        results.addValue(new FailureValue(
            options.run_info, 'TraceImportError',
            {description: k + ' is on model and corpus tables!',
             stack: tr.b.stackTraceAsString()}));
        return;
      }
      model.metadata[k] = options.metadata[k];
    }

    // Map the function.
    var numResultsBeforeMapping = results.all_values.length;
    try {
      mapFunction(results, options.run_info, model);
    } catch (ex) {
      var ex = tr.b.normalizeException(ex);
      results.addValue(new FailureValue(
          options.run_info, 'MapFunctionError',
          {description: ex.message, stack: ex.stack}));
      return;
    }

    if (results.all_values.length === numResultsBeforeMapping) {
      results.addValue(new FailureValue(
          options.run_info, 'NoResultsAddedError',
          {'description': options.map_file + ' did not add any results! ' +
              'Add a SkipValue if this was intentional.',
           stack: tr.b.stackTraceAsString()}));
      return;
    }
  }

  return {
    mapSingleTrace: mapSingleTrace
  };
});
</script>

