// 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.
//
var localStreams = [];
var remoteStreams = [];

function ping(callback) {
  callback("pong");
}

function getUserMedia(constraints, onSuccessCallback, onFailCallback){
  console.log("Getting user media.");
  navigator.webkitGetUserMedia(constraints,
      onSuccessCallbackWraper, onFailCallback);

  function onSuccessCallbackWraper(stream) {
    console.log("GetUserMedia success.");
    localStreams[stream.id] = stream;
    onSuccessCallback(stream);
  }
}

function createPeerConnection(config, doneCallback, failCallback) {
  console.log("Creating peer connection");
  var obj = {};
  var pc = new webkitRTCPeerConnection(config);

  expose(obj, pc, "close");
  expose(obj, pc, "createOffer");
  expose(obj, pc, "createAnswer");
  expose(obj, pc, "addEventListener");
  expose(obj, pc, "addIceCandidate", { 0: RTCIceCandidate});
  expose(obj, pc, "setRemoteDescription", { 0: RTCSessionDescription });
  expose(obj, pc, "setLocalDescription", { 0: RTCSessionDescription });

  obj.addStream = function(stream) {
    console.log("Adding local stream.");
    var tempStream = localStreams[stream.id];
    if (!tempStream) {
      console.log("Undefined stream!");
      return;
    }
    pc.addStream(tempStream);
  };

  // Return an array of Objects, each Object is a copy of RTCStateReport
  // and has the following attributes (id, type, names, and stats).
  // names: array originaly returned by calling RTCStateReport.names().
  // stats: dictionary of stat name as key and stat value as dictionary
  // value.
  obj.getStats = function(callback, mediaTrack) {
    pc.getStats(onStatsReady, mediaTrack);

    function onStatsReady(stateResponse) {
      var outputReports = [];
      var reports = stateResponse.result();
      for (index in reports) {
        var report = {};
        report.id = reports[index].id;
        report.type = reports[index].type;
        report.names = reports[index].names();
        report.stats = [];
        populateStats(reports[index], report.stats);

        outputReports.push(report);
      }

      callback(outputReports);
    }

    function populateStats(report, stats) {
      var names = report.names();
      for (index in names) {
        stats.push({
           name: names[index],
           stat: report.stat(names[index]),
          });
      }

    }
  };

  pc.addEventListener('addstream', function(event) {
    remoteStreams[event.stream.id] = event.stream;
  });

  doneCallback(obj);
};

function showStream(streamId, autoplay, muted) {
  var stream = getStreamFromIdentifier_(streamId);
  var video = document.createElement('video');
  video.autoplay = autoplay;
  video.muted = muted;
  document.body.appendChild(video);
  video.src = URL.createObjectURL(stream);
  console.log("Stream " + stream.id + " attached to video element");
};

function getStreamFromIdentifier_(id) {
  var tempStream = localStreams[id];
  if (tempStream)
    return tempStream;
  tempStream = remoteStreams[id];
  if (tempStream)
    return tempStream;
  console.log(id + " is not id for stream.");
  return null;
};

function downloadFile(path, onSuccess, onError) {
  var xhr = new XMLHttpRequest();
  function onResult() {
    if (xhr.readyState != 4)
      return;

    if (xhr.status != 200) {
      onError("Download request failed!");
      return;
    }
    onSuccess(xhr.responseText);
  }

  xhr.onreadystatechange = onResult;
  xhr.open('GET', path, true);
  xhr.send();
};

connectToServer({
  ping: ping,
  getUserMedia: getUserMedia,
  createPeerConnection: createPeerConnection,
  showStream: showStream,
  downloadFile: downloadFile,
});