/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */

/*
  Network API overview: http://www.w3.org/TR/netinfo-api/
  and http://w3c.github.io/netinfo/
*/

var Connection = require('./Connection'),
    modulemapper = require('cordova/modulemapper');

var origConnection = modulemapper.getOriginalSymbol(window, 'navigator.connection');

module.exports = {

  getConnectionInfo: function(successCallback, errorCallback) {
    var connection = origConnection || navigator.mozConnection,
        connectionType = Connection.UNKNOWN;

    if (!connection) {
        setTimeout(function() {
            successCallback(connectionType);
        }, 0);
        return;
    }

    var bandwidth = connection.bandwidth,
      metered = connection.metered,
      type = connection.type;

    if (type !== undefined) {
      // For more information see:
      // https://developer.mozilla.org/en-US/docs/Web/API/Network_Information_API

      switch(type) {
        case "cellular":
          connectionType = Connection.CELL;
          break;
        case "ethernet":
          connectionType = Connection.ETHERNET;
          break;
        case "wifi":
          connectionType = Connection.WIFI;
          break;
        case "none":
          connectionType = Connection.NONE;
          break;
      }
    } else if (bandwidth !== undefined && metered !== undefined) {
      /*
      bandwidth of type double, readonly
      The user agent must set the value of the bandwidth attribute to:
      0 if the user is currently offline;
      Infinity if the bandwidth is unknown;
      an estimation of the current bandwidth in MB/s (Megabytes per seconds)
      available for communication with the browsing context active document's
      domain.

      For more information see:
      https://developer.mozilla.org/en-US/docs/Web/API/Connection
      */

      if (bandwidth === 0) {
        connectionType = Connection.NONE;
      } else if (metered && isFinite(bandwidth)) {
        connectionType = Connection.CELL;
      } else if (!metered && isFinite(bandwidth)) {
        connectionType = Connection.WIFI;
      }
    }

    setTimeout(function() {
      successCallback(connectionType);
    }, 0);
  }
};

require("cordova/exec/proxy").add("NetworkStatus", module.exports);
