<!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="/base/base.html">
<link rel="import" href="/base/iteration_helpers.html">
<link rel="import" href="/extras/rail/rail_score.html">
<link rel="import" href="/ui/extras/deep_reports/scalar_value.html">
<link rel="import" href="/base/xhr.html">

<script>
'use strict';

tr.exportTo('tr.ui.e.deep_reports', function() {
  /**
   * Runs deep reports on the provided files, and pushes telemetry-style
   * values to the results object.
   */
  function main(results, filesInDir) {
    var lastP = new Promise(function(resolve) { resolve(); });

    filesInDir.forEach(function(filename) {
      // TODO(nduca): Make this like telemetry page.
      var page = {
        url: filename
      };
      lastP = lastP.then(function() {
        return loadModelFromFileAsync(filename);
      });
      lastP = lastP.then(function(model) {
        processModel(results, page, model);
      });
    });
    return lastP;
  }

  function loadModelFromFileAsync(filename) {
    return tr.b.getAsync(filename).then(function(trace) {
      var io = new tr.ImportOptions();
      io.shiftWorldToZero = true;
      io.pruneEmptyContainers = false;

      var m = new tr.Model();
      try {
        m.importTraces([trace], io);
      } catch (e) {
        throw new Error('While loading ' + filename + ' got: ' + e.toString());
      }
      return m;
    });
  }

  function processModel(results, page, model) {
    var railScore = tr.e.rail.RAILScore.fromModel(model);
    if (railScore === undefined)
      return;

    results.addValue(
        new tr.ui.e.deep_reports.ScalarValue(
            page, 'numRailIRs', 'ms', railScore.interactionRecords.length));
    results.addValue(
      new tr.ui.e.deep_reports.ScalarValue(
        page, 'railScore', 'rails', railScore.overallScore));
  }

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