// Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS.  All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
//
google.load("visualization", "1", {packages:["corechart"]});

function openFiles(event) {
  var files = event.target.files;
  readAndAnalyzeFiles(files)
}

function readAndAnalyzeFiles(files) {
  if(!files) {
    alert("No files have been selected!");
    return;
  }

  var reports = [];
  var filesNames = [];
  missingFiles = files.length;

  for(var i = 0; i < files.length; i++) {
    var reader = new FileReader();
    reader.onload = onReaderLoad.bind(reader, files[i].name);
    reader.readAsText(files[i]);
  }

  function onReaderLoad(fileName) {
    reports.push(JSON.parse(this.result));
    filesNames.push(fileName);

    missingFiles--;
    if(missingFiles == 0) {
      analyzeReports_(reports, filesNames);
    }
  }
}

// TODO(houssainy) take the input stats from the select list or
// drop down menu in html.
function analyzeReports_(reports, filesNames) {
  filesNames.unshift(""); // ned

  // Rtt
  analyzeRttData(reports, filesNames, "bot1");
  analyzeRttData(reports, filesNames, "bot2");

  // Send Packets Lost
  analyzePacketsLostData(reports, filesNames, "bot1");
  analyzePacketsLostData(reports, filesNames, "bot2");

  // Send bandwidth
  analyzeData(reports, filesNames, "Available Send Bandwidth-bot1", "bot1",
      "bweforvideo", "googAvailableSendBandwidth");
  analyzeData(reports, filesNames, "Available Send Bandwidth-bot2", "bot2",
      "bweforvideo", "googAvailableSendBandwidth");

   // Receive bandwidth
   analyzeData(reports, filesNames, "Available Receive Bandwidth-bot1", "bot1",
       "bweforvideo", "googAvailableReceiveBandwidth");
   analyzeData(reports, filesNames, "Available Receive Bandwidth-bot2", "bot2",
     "bweforvideo", "googAvailableReceiveBandwidth");

  drawSeparatorLine();
}

function analyzeRttData(reports, filesNames, botName) {
  var outPut = [];
  outPut.push(filesNames);

  var avergaData = ['Average Rtt x10'];
  var maxData = ['Max Rtt'];

  var average;
  var max;
  for(var index in reports) {
    average = getStateAverage(reports[index], botName, "Conn-audio-1-0",
      "googRtt");
    avergaData.push(average*10);

    max = getStateMax(reports[index], botName, "Conn-audio-1-0",
      "googRtt");
    maxData.push(max);
  }
  outPut.push(avergaData);
  outPut.push(maxData);

  drawChart("Rtt-" + botName, outPut);
}

function analyzePacketsLostData(reports, filesNames, botName) {
  var outPut = [];
  outPut.push(filesNames);

  var maxData = ['Max Send PacketsLost'];
  var max;
  for(var index in reports) {
    max = getStateMax(reports[index], botName, "ssrc_[0-9]+_send",
        "packetsLost");
    maxData.push(max);
  }
  outPut.push(maxData);

  drawChart("Send PacketsLost-" + botName, outPut);
}

function analyzeData(reports, filesNames, chartName, botName, reportId,
    statName) {
  var outPut = [];
  outPut.push(filesNames);

  var avergaData = ['Average ' + statName];
  var maxData = ['Max ' + statName];

  var average;
  var max;
  for(var index in reports) {
    average = getStateAverage(reports[index], botName, reportId, statName);
    avergaData.push(average);

    max = getStateMax(reports[index], botName, reportId, statName);
    maxData.push(max);
  }
  outPut.push(avergaData);
  outPut.push(maxData);

  drawChart(chartName, outPut);
}

function getStateAverage(reports, botName, reportId, statName) {
  var sum = 0;
  var count = 0;

  for (var index in reports) {
    var data = reports[index].data;
    if(index == 0 || !data.hasOwnProperty(botName))
      continue;

    var stats = data[botName];
    for (var key in stats) {
      if(key.search(reportId) != -1) {
        var value = parseInt(stats[key][statName]);
        sum += value;
        count++;
      }
    }
  }
  return Math.round(sum/count);
}

function getStateMax(reports, botName, reportId, statName) {
  var max = -1;

  for (var index in reports) {
    var data = reports[index].data;
    if(index == 0 || !data.hasOwnProperty(botName))
      continue;

    var stats = data[botName];
    for (var key in stats) {
      if(key.search(reportId) != -1) {
        var value = parseInt(stats[key][statName]);
        max = Math.max(value, max);
      }
    }
  }
  return max;
}

function drawChart(title, data) {
  var dataTable = google.visualization.arrayToDataTable(data);

  var options = {
    title: title,
  };

  var div = document.createElement('div');
  document.body.appendChild(div);

  var chart = new google.visualization.ColumnChart(div);
  chart.draw(dataTable, options);
}

function drawSeparatorLine()  {
  var hr = document.createElement('hr');
  document.body.appendChild(hr);
}