(function(window) {
	var m = {};

	document.addEventListener("plusready", function() {
		// 声明的JS“扩展插件别名”
		var _BLECODE = 'SDSPlugin',
			B = window.plus.bridge;
		var sdstool = {
			// 声明异步返回方法

			login: function(userInfo, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "login", [callbackID, userInfo]);
			},
			
			logout: function(successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "logout", [callbackID]);
			},
			
			/** ******************下行監聽API**********************  **/

			//注册下行监听
			registerPushListener: function(successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "registerPushListener", [callbackID]);
			},

			//注销下行监听
			unregisterPushListener: function(successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "unregisterPushListener", [callbackID]);
			},

			/** ******************產品API**********************  **/
			//获取产品列表
			getProductList: function(successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "getProductList", [callbackID]);
			},

			//查询产品信息
			getProductDetail: function(model, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "getProductDetail", [callbackID, model]);
			},
			//获取系统时间
			getAlinktime: function(successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "getAlinktime", [callbackID]);
			},

			//注册设备 （目前仅限蓝牙设备需要主动调用该接口）
			//TODO
			registerByuser: function(model, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "registerByuser", [callbackID, model]);
			},
			//绑定设备
			bindDevice: function(successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "bindDevice", [callbackID]);
			},
			//解绑设备
			unbindDevice: function(uuid, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "unbindDevice", [callbackID, uuid]);
			},
			//生成二维码
			saveqr: function(uuid, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "saveqr", [callbackID, uuid]);
			},
			//扫描二维码
			scanqr: function(qr_key, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "scanqr", [callbackID, qr_key]);
			},

			//			getDevicesByuser: function(successCallback, errorCallback) {
			//				console.log(11111111111);
			//				var success = typeof successCallback !== 'function' ? null : function(args) {
			//						successCallback(args);
			//					},
			//					fail = typeof errorCallback !== 'function' ? null : function(code) {
			//						errorCallback(code);
			//					};
			//				callbackID = B.callbackId(success, fail);
			//				return B.exec(_BLECODE, "getDevicesByuser", [callbackID]);
			//			},

			//获取与当前用户绑定的所有设备
			getDevicesByuser: function(successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "getDevicesByuser", [callbackID]);
			},
			//获取设备最新状态
			getDeviceStatus: function(uuid, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "getDeviceStatus", [callbackID, uuid]);
			},
			//设置设备属性
			setDeviceStatus: function(uuid, setParams, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "setDeviceStatus", [callbackID, uuid, setParams]);
			},
			//获取设备详情
			getDeviceDetail: function(uuid, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "getDeviceDetail", [callbackID, uuid]);
			},
			//上报设备数据
			postDeviceData: function(uuid, deviceData, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "postDeviceData", [callbackID, uuid, deviceData]);
			},
			//更改设备昵称
			updateDeviceInfo: function(uuid, nickName, model, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "updateDeviceInfo", [callbackID, uuid, nickName, model]);
			},
			//保存用户私有数据
			savePrivateData: function(dataKey, dataValue, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "savePrivateData", [callbackID, dataKey, dataValue]);
			},
			//获取用户私有数据
			getPrivateData: function(dataKey, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "getPrivateData", [callbackID, dataKey]);
			},
			//设备状态变更
			//TODO(需要商量處理)
			deviceStatusChange: function(dataKey, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "deviceStatusChange", [callbackID, dataKey]);
			},
			//设备绑定关系变更下行推送
			deviceBindRelChange: function(uuid, auid, relation, successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "deviceBindRelChange", [callbackID, uuid, auid, relation]);
			},
			//设备配网
			wifiBind: function(successCallback, errorCallback) {
				var success = typeof successCallback !== 'function' ? null : function(args) {
						successCallback(args);
					},
					fail = typeof errorCallback !== 'function' ? null : function(code) {
						errorCallback(code);
					};
				callbackID = B.callbackId(success, fail);
				return B.exec(_BLECODE, "wifiBind", [callbackID]);
			},
			/******************** 设备自定义配网API ******************************/
            //获取ssid
            getSSId: function (successCallback, errorCallback) {
                var success = typeof successCallback !== 'function' ? null : function (args) {
                        successCallback(args);
                    },
                    fail = typeof errorCallback !== 'function' ? null : function (code) {
                        errorCallback(code);
                    };
                callbackID = B.callbackId(success, fail);
                return B.exec(_BLECODE, "getSSId", [callbackID]);
            },
            //开始查找设备
            findDevices: function (successCallback, errorCallback) {
                var success = typeof successCallback !== 'function' ? null : function (args) {
                        successCallback(args);
                    },
                    fail = typeof errorCallback !== 'function' ? null : function (code) {
                        errorCallback(code);
                    };
                callbackID = B.callbackId(success, fail);
                return B.exec(_BLECODE, "findDevices", [callbackID]);
            },
            //停止查找设备
            stopFindDevices: function (successCallback, errorCallback) {
                var success = typeof successCallback !== 'function' ? null : function (args) {
                        successCallback(args);
                    },
                    fail = typeof errorCallback !== 'function' ? null : function (code) {
                        errorCallback(code);
                    };
                callbackID = B.callbackId(success, fail);
                return B.exec(_BLECODE, "stopFindDevices", [callbackID]);
            },
            //开始连接wifi
            startFindWIFI: function (model, ssid, wifiPWD, timeOut, successCallback, errorCallback) {
                var success = typeof successCallback !== 'function' ? null : function (args) {
                        successCallback(args);
                    },
                    fail = typeof errorCallback !== 'function' ? null : function (code) {
                        errorCallback(code);
                    };
                callbackID = B.callbackId(success, fail);
                return B.exec(_BLECODE, "startFindWIFI", [callbackID, model, ssid, wifiPWD, timeOut]);
            },
            //停止连接wifi
            stopFindWIFI: function (successCallback, errorCallback) {
                var success = typeof successCallback !== 'function' ? null : function (args) {
                        successCallback(args);
                    },
                    fail = typeof errorCallback !== 'function' ? null : function (code) {
                        errorCallback(code);
                    };
                callbackID = B.callbackId(success, fail);
                return B.exec(_BLECODE, "stopFindWIFI", [callbackID]);
            }
		};
		window.plus.sdstool = sdstool;
	}, true);

	m.login = function(userInfo, success, failure) {
		console.log(11111);
		plus.sdstool.login(userInfo, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	
	m.logout = function(success, failure) {
		plus.sdstool.logout(function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};

	m.getProductList = function(success, failure) {
		plus.sdstool.getProductList(function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.registerPushListener = function(success, failure) {
		plus.sdstool.registerPushListener(function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.unregisterPushListener = function(success, failure) {
		plus.sdstool.unregisterPushListener(function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.getProductDetail = function(model, success, failure) {
		plus.sdstool.getProductDetail(model, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.getAlinktime = function(success, failure) {
		plus.sdstool.getAlinktime(function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.registerByuser = function(model, success, failure) {
		plus.sdstool.registerByuser(model, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.bindDevice = function(uuid, success, failure) {
		plus.sdstool.bindDevice(uuid, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.unbindDevice = function(uuid, success, failure) {
		plus.sdstool.unbindDevice(uuid, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.saveqr = function(uuid, success, failure) {
		plus.sdstool.saveqr(uuid, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			console.log(err);
			failure(err);
		});
	};
	m.scanqr = function(qr_key, success, failure) {
		plus.sdstool.scanqr(qr_key, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.getDevicesByuser = function(success, failure) {
		plus.sdstool.getDevicesByuser(function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.getDeviceStatus = function(uuid, success, failure) {
		plus.sdstool.getDeviceStatus(uuid,function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.setDeviceStatus = function(uuid, setParams, success, failure) {
		plus.sdstool.setDeviceStatus(uuid, setParams, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.getDeviceDetail = function(uuid, success, failure) {
		plus.sdstool.getDeviceDetail(uuid, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.postDeviceData = function(uuid, deviceData, success, failure) {
		plus.sdstool.postDeviceData(uuid, deviceData, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.updateDeviceInfo = function(uuid, nickName, model, success, failure) {
		plus.sdstool.updateDeviceInfo(uuid, nickName, model, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.savePrivateData = function(dataKey, dataValue, success, failure) {
		plus.sdstool.savePrivateData(dataKey, dataValue, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.getPrivateData = function(dataKey, success, failure) {
		plus.sdstool.getPrivateData(dataKey, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	//TODO
	m.deviceStatusChange = function(dataKey, success, failure) {
		plus.sdstool.deviceStatusChange(dataKey, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};
	m.deviceBindRelChange = function(uuid, auid, relation, success, failure) {
		plus.sdstool.deviceBindRelChange(uuid, auid, relation, function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};

	m.wifiBind = function(success, failure) {
		plus.sdstool.wifiBind(function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};

	/******************** 设备自定义配网API ******************************/
    //获取ssid
    m.getSSId = function(success, failure) {
		plus.sdstool.getSSId(function(ret) {
			success(ret);
			console.log(ret);
		}, function(err) {
			failure(err);
		});
	};

	m.startFindWIFI = function(model, ssid, wifiPWD, timeOut, success, failure) {
		plus.sdstool.startFindWIFI(model, ssid, wifiPWD, timeOut, function(ret) {
			success(ret);
//            console.log(ret);
		}, function(err) {
			failure(err);
		});
	};

	window.SDSPlugin = m;

})(window);
