let baja_subscribe_device_callback_func; //設定BQL訂閱之後要回傳的Function
let baja_subscribe_end_device_callback_func; //設定BQL訂閱結束之後要回傳的Function
//let baja_my_user_account_func;    //取得帳號資料要回傳的Function
var ordPath; //當前點選選單的tag,用來抓出設備路徑,例如:旅館棟->H,消防偵煙器->F3

let baja_subscribe_alarm_callback_func; //設定 alarm BQL訂閱之後要回傳的Function
let baja_subscribe_end_alarm_callback_func; //設定 alarm BQL訂閱結束之後要回傳的Function
var ordPathForAlarm; //當前點選選單的tag,用來抓出alarm路徑

let baja_subscribe_electricmeter_callback_func;
let baja_subscribe_end_electricmeter_callback_func;
var ordPathForElectricmeter;

var startPageLoading;  // 開始 loading
var endPageLoading;  // 開始 loading
//window.baja = null;
//require(['baja!'], function (baja) {
//    window.baja = baja;
//})

window.tolSubList = [];

var user_name = "";

class subscriptionDevices {
  constructor() {
    this.ordPath = {};
    this.changeCallback = null;
    this.changeEndCallback = null;
  }

  setSubscribeDevicesByBql = function (tempOrdPath) {
    this.ordPath = tempOrdPath;
    this.BajaSubscribeDevicesByBql();
  };

  setSubscribeDevicesCallBack = function (callBackFunc) {
    // console.log(callBackFunc)
    if (callBackFunc != undefined && callBackFunc != null) {
      this.changeCallback = callBackFunc;
    }
  }
  // BQL訂閱結束回傳的Function
  setSubscribeDeviceEndCallBack = function (callBackFunc) {
    if (callBackFunc != undefined && callBackFunc != null) {
      this.changeEndCallback = callBackFunc;
    }
  }

  BajaSubscribeDevicesByBql = function () {
    let _this = this;
    require(['baja!'], function (baja) {
      console.log("進入Function 準備執行BQL訂閱");
      startPageLoading ? startPageLoading() : ""
      var init_start = new Date(Date.now());
      var sub = new baja.Subscriber();

      sub.attach('changed', function (prop) {
        if (prop.getName() === 'out') {
          var out_value = this.getOutDisplay();
          var target_device_number = this.$parent.getDisplayName().split('_').slice(0, 5).join('_');
          var point_name = this.getDisplayName();

          //依據Facets判斷回傳的內容值為何
          var facets_split = this.getFacets1().$cEncStr.split('|');
          var facets_arr = [];
          facets_split.forEach(function (item, index) {
            facets_arr.push(item.split('=s:'));
          });

          var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

          var point_out_split = this.getOutDisplay().split(' ');

          let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

          if (key == undefined) {
            key = point_out_split[0];
          }

          var modify_target_device = {
            "device_number": target_device_number ? target_device_number : null,
            "device_number_full": this.$parent.getSlotPath().$names.join("_"),
            "point_name": point_name ? point_name : null,
            "value": key
          }
          if (_this.changeCallback != undefined && _this.changeCallback != null) {
            _this.changeCallback(modify_target_device, true); //第2參數用在平面圖,刷新畫面
          }
        }
      }, function (err) {
        console.log(err)
      });

      //使用bql語法
      // var building_tag = "H";
      // var system_tag = "M10";
      // baja.Ord.make(`ip:greencloud.fic.com.tw|foxs:|station:|slot:/Arena/${building_tag}/${system_tag}|bql:select name, displayname, slotPath, out.value, out from control:ControlPoint`)
      console.log(`local:|foxs:${port}|station:|slot:/${_this.ordPath.area_tag}/${_this.ordPath.building_tag}/${_this.ordPath.system_tag}/${_this.ordPath.name_tag}${_this.ordPath.flo_tag ? `/${_this.ordPath.flo_tag}` : ""}|bql:select name, displayname, slotPath, out.value, out, facets  from control:ControlPoint`);
      baja.Ord.make(`local:|foxs:${port}|station:|slot:/${_this.ordPath.area_tag}/${_this.ordPath.building_tag}/${_this.ordPath.system_tag}/${_this.ordPath.name_tag}${_this.ordPath.flo_tag ? `/${_this.ordPath.flo_tag}` : ""}|bql:select name, displayname, slotPath, out.value, out, facets  from control:ControlPoint`)
        .get(
          function (table) {
            var tableStart, tableFinish;
            var subStart, subFinish;
            var component_index = 0;
            var total_component_index = 0;
            var totalTargetDevice = [];
            var readBqlFinish = new Date(Date.now());
            // $("#readPath-finish-timestamp").html(readBqlFinish.toISOString());
            // $("#readPath-finish-time").html((readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
            console.log("讀取路徑完成-花費時間", (readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
            table.cursor({
              before: function () {
                totalTargetDevice = [];
                tableStart = new Date(Date.now());
                $("#table-start-timestamp").html(tableStart.toISOString());


              },
              each: function (item, index) {
                if (index < 1) {
                  subStart = new Date(Date.now());
                  $("#sub-start").html(subStart.toISOString());
                }
                $("#sub-number").html(index + 1);
                total_component_index = index;



                var target_device_number_split = this.getDisplay("slotPath").split('/');
                var target_device_number = target_device_number_split[8];
                //console.log(target_device_number);
                var point_name = this.getDisplay("name");
                var facets = this.getDisplay("facets");

                //依據Facets判斷回傳的內容值為何
                var facets_split = facets.split(',');
                var facets_arr = [];
                facets_split.forEach(function (item, index) {
                  facets_arr.push(item.split('='));
                });

                facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

                var point_out_split = this.getDisplay("out").split(' ');

                let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

                if (key == undefined) {
                  key = point_out_split[0];
                }

                var modify_target_device = {
                  "device_number": target_device_number ? target_device_number : null,
                  "device_number_full": this.getDisplay("slotPath").split("slot:")[1].split('/').slice(1, -1).join("_"),
                  "point_name": point_name ? point_name : null,
                  "value": key
                }
                totalTargetDevice.push(modify_target_device);
                //取得component當下就更新設備點位
                // if (_this.changeCallback != undefined && _this.changeCallback != null) {
                //     _this.changeCallback(modify_target_device);
                // }
                if (pageAct.sysSubTag === "L1") {
                  if (point_name === "SSC" || point_name === "TRIP" || point_name === "ONOFF") {
                    if (_this.changeCallback != undefined && _this.changeCallback != null) {
                      _this.changeCallback(modify_target_device, true); //第2參數用在平面圖,刷新畫面
                      baja.Ord.make(`local:|foxs:${port}|station:|` + this.getDisplay("slotPath"))
                        .get()
                        .then(function (component) {
                          // console.log("component",component)
                          component_index++;
                          var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_');

                          var out_value = component.getOutDisplay();
                          var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_');
                          var point_name = component.getDisplayName();
                          //依據Facets判斷回傳的內容值為何
                          var facets_split = component.getFacets1().$cEncStr.split('|');
                          var facets_arr = [];
                          facets_split.forEach(function (item, index) {
                            facets_arr.push(item.split('=s:'));
                          });

                          var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

                          var point_out_split = component.getOutDisplay().split(' ');

                          let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

                          if (key == undefined) {
                            key = point_out_split[0];
                          }

                          var modify_target_device = {
                            "device_number": target_device_number ? target_device_number : null,
                            "device_number_full": component.$parent.getSlotPath().$names.join("_"),
                            "point_name": point_name ? point_name : null,
                            "value": key
                          }

                          if (pageAct.sysSubTag === "L1") {
                            if (point_name === "SSC" || point_name === "TRIP" || point_name === "ONOFF") {
                              if (_this.changeCallback != undefined && _this.changeCallback != null) {
                                _this.changeCallback(modify_target_device, true); //第2參數用在平面圖,刷新畫面
                              }
                            }
                          } else {
                            if (_this.changeCallback != undefined && _this.changeCallback != null) {
                              _this.changeCallback(modify_target_device, true); //第2參數用在平面圖,刷新畫面
                            }
                          }


                          // //依據Facets判斷回傳的內容值為何
                          // var facets_split = component.getFacets1().$cEncStr.split('|');
                          // var facets_arr = [];
                          // facets_split.forEach(function (item, index) {
                          //   facets_arr.push(item.split('=s:'));
                          // });

                          // var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

                          // var point_out_split = component.getOutDisplay().split(' ');

                          // let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

                          // if (key == undefined) {
                          //   key = point_out_split[0];
                          // }

                          // var modify_target_device = {
                          //   "device_number": target_device_number ? target_device_number : null,
                          //   "point_name": point_name ? point_name : null,
                          //   "value": key
                          // }

                          // //取得component當下就更新設備點位
                          // if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) {
                          //   if (component_index == total_component_index) {
                          //     baja_subscribe_device_callback_func(modify_target_device, true);
                          //   }
                          //   else {
                          //     baja_subscribe_device_callback_func(modify_target_device);
                          //   }
                          // }

                          if (pageAct.sysSubTag === "L1") {
                            if (point_name === "SSC" || point_name === "TRIP" || point_name === "ONOFF") {
                              sub.subscribe({
                                comps: component,
                              });
                            }
                          } else {
                            sub.subscribe({
                              comps: component,
                            });
                          }

                          // sub.subscribe({
                          //     comps: component,
                          // });
                          tolSubList.push(sub);
                          subFinish = new Date(Date.now());
                          $("#sub-end").html(subFinish.toISOString());
                          $("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
                          // console.log("訂閱完成時間", (subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
                        });
                    }
                  }
                } else {
                  if (_this.changeCallback != undefined && _this.changeCallback != null) {
                    _this.changeCallback(modify_target_device, true); //第2參數用在平面圖,刷新畫面
                    baja.Ord.make(`local:|foxs:${port}|station:|` + this.getDisplay("slotPath"))
                      .get()
                      .then(function (component) {
                        component_index++;
                        var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_');

                        var out_value = component.getOutDisplay();
                        var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_');
                        var point_name = component.getDisplayName();
                        //依據Facets判斷回傳的內容值為何
                        var facets_split = component.getFacets1().$cEncStr.split('|');
                        var facets_arr = [];
                        facets_split.forEach(function (item, index) {
                          facets_arr.push(item.split('=s:'));
                        });

                        var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

                        var point_out_split = component.getOutDisplay().split(' ');

                        let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

                        if (key == undefined) {
                          key = point_out_split[0];
                        }

                        var modify_target_device = {
                          "device_number": target_device_number ? target_device_number : null,
                          "device_number_full": component.$parent.getSlotPath().$names.join("_"),
                          "point_name": point_name ? point_name : null,
                          "value": key
                        }

                        if (pageAct.sysSubTag === "L1") {
                          if (point_name === "SSC" || point_name === "TRIP" || point_name === "ONOFF") {
                            if (_this.changeCallback != undefined && _this.changeCallback != null) {
                              _this.changeCallback(modify_target_device, true); //第2參數用在平面圖,刷新畫面
                            }
                          }
                        } else {
                          if (_this.changeCallback != undefined && _this.changeCallback != null) {
                            _this.changeCallback(modify_target_device, true); //第2參數用在平面圖,刷新畫面
                          }
                        }


                        // //依據Facets判斷回傳的內容值為何
                        // var facets_split = component.getFacets1().$cEncStr.split('|');
                        // var facets_arr = [];
                        // facets_split.forEach(function (item, index) {
                        //   facets_arr.push(item.split('=s:'));
                        // });

                        // var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

                        // var point_out_split = component.getOutDisplay().split(' ');

                        // let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

                        // if (key == undefined) {
                        //   key = point_out_split[0];
                        // }

                        // var modify_target_device = {
                        //   "device_number": target_device_number ? target_device_number : null,
                        //   "point_name": point_name ? point_name : null,
                        //   "value": key
                        // }

                        // //取得component當下就更新設備點位
                        // if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) {
                        //   if (component_index == total_component_index) {
                        //     baja_subscribe_device_callback_func(modify_target_device, true);
                        //   }
                        //   else {
                        //     baja_subscribe_device_callback_func(modify_target_device);
                        //   }
                        // }

                        if (pageAct.sysSubTag === "L1") {
                          if (point_name === "SSC" || point_name === "TRIP" || point_name === "ONOFF") {
                            sub.subscribe({
                              comps: component,
                            });
                          }
                        } else {
                          sub.subscribe({
                            comps: component,
                          });
                        }

                        // sub.subscribe({
                        //     comps: component,
                        // });
                        tolSubList.push(sub);
                        subFinish = new Date(Date.now());
                        $("#sub-end").html(subFinish.toISOString());
                        $("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
                        // console.log("訂閱完成時間", (subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
                      });
                  }
                }



              },
              after: function () {
                tableFinish = new Date(Date.now());
                // $("#table-finish-timestamp").html(tableFinish.toISOString());
                // $("#table-time").html((tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
                //取得component當下就更新設備點位
                if (_this.changeEndCallback != undefined && _this.changeEndCallback != null) {
                  _this.changeEndCallback(totalTargetDevice);
                }
                endPageLoading ? endPageLoading() : ""
                console.log("表格完成時間", (tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
              },
              limit: -1,
              offset: 0
            });
          });
    })
  }
}

//function subscriptionDevices() {
//    // 用BQL的方式去訂閱
//    this.setSubscribeDevicesByBql = function (tempOrdPath) {
//        ordPath = tempOrdPath;
//        BajaSubscribeDevicesByBql();
//    };
//    // BQL去訂閱回傳的Function
//    this.setSubscribeDevicesCallBack = function (callBackFunc) {
//        if (callBackFunc != undefined && callBackFunc != null) {
//            baja_subscribe_device_callback_func = callBackFunc;
//        }
//    }
//    // BQL訂閱結束回傳的Function
//    this.setSubscribeDeviceEndCallBack = function (callBackFunc) {
//        if (callBackFunc != undefined && callBackFunc != null) {
//            baja_subscribe_end_device_callback_func = callBackFunc;
//        }
//    }

//}

function subscriptionAlarms() {
  // 用BQL的方式去訂閱
  this.setSubscribeAlarmsByBql = function (tempOrdPath) {
    BajaSubscribeAlarmsByBql(tempOrdPath);
  };
  // BQL去訂閱回傳的Function
  this.setSubscribeAlarmsCallBack = function (callBackFunc) {
    if (callBackFunc != undefined && callBackFunc != null) {
      baja_subscribe_alarm_callback_func = callBackFunc;
    }
  }
  // BQL訂閱結束回傳的Function
  this.setSubscribeAlarmEndCallBack = function (callBackFunc) {
    if (callBackFunc != undefined && callBackFunc != null) {
      baja_subscribe_end_alarm_callback_func = callBackFunc;
    }
  }

}

function subscriptionElectricmeter() {
  // 用BQL的方式去訂閱
  this.setSubscribeElectricmeterByBql = function (tempOrdPath) {
    BajaSubscribeElectricmeterByBql(tempOrdPath);
  };
  // BQL去訂閱回傳的Function
  this.setSubscribeElectricmeterCallBack = function (callBackFunc) {
    if (callBackFunc != undefined && callBackFunc != null) {
      baja_subscribe_electricmeter_callback_func = callBackFunc;
    }
  }
  // BQL訂閱結束回傳的Function
  this.setSubscribeElectricmeterEndCallBack = function (callBackFunc) {
    if (callBackFunc != undefined && callBackFunc != null) {
      baja_subscribe_end_electricmeter_callback_func = callBackFunc;
    }
  }
}

function MyBaja() {
  // 取得使用者帳號
  this.setMyUserAccount = function (callBackFunc = null) {
    require(['baja!'], function (baja) {
      user_name = baja.getUserName();
      callBackFunc ? callBackFunc(user_name) : "";
    });

  };
}

/**
 * 使用者透過BQL指定路徑去訂閱設備點位
 */
//function BajaSubscribeDevicesByBql() {


//    require(['baja!'], function (baja) {
//        console.log("進入Function 準備執行BQL訂閱");
//        startPageLoading ? startPageLoading() : ""
//        var init_start = new Date(Date.now());
//        var sub = new baja.Subscriber();

//        sub.attach('changed', function (prop) {
//            if (prop.getName() === 'out') {
//                var out_value = this.getOutDisplay();
//                var target_device_number = this.$parent.getDisplayName().split('_').slice(0, 5).join('_');
//                var point_name = this.getDisplayName();

//                //依據Facets判斷回傳的內容值為何
//                var facets_split = this.getFacets1().$cEncStr.split('|');
//                var facets_arr = [];
//                facets_split.forEach(function (item, index) {
//                    facets_arr.push(item.split('=s:'));
//                });

//                var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

//                var point_out_split = this.getOutDisplay().split(' ');

//                let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

//                if (key == undefined) {
//                    key = point_out_split[0];
//                }

//                var modify_target_device = {
//                    "device_number": target_device_number ? target_device_number : null,
//                    "device_number_full": this.$parent.getSlotPath().$names.join("_"),
//                    "point_name": point_name ? point_name : null,
//                    "value": key
//                }

//                if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) {
//                    baja_subscribe_device_callback_func(modify_target_device, true); //第2參數用在平面圖,刷新畫面
//                }
//            }
//        }, function (err) {
//            console.log(err)
//        });

//        //使用bql語法
//        // var building_tag = "H";
//        // var system_tag = "M10";
//        // baja.Ord.make(`ip:greencloud.fic.com.tw|foxs:|station:|slot:/Arena/${building_tag}/${system_tag}|bql:select name, displayname, slotPath, out.value, out from control:ControlPoint`)
//        console.log(`local:|foxs:${port}|station:|slot:/${_this.ordPath.area_tag}/${ordPath.building_tag}/${ordPath.system_tag}/${ordPath.name_tag}|bql:select name, displayname, slotPath, out.value, out, facets  from control:ControlPoint`);
//        baja.Ord.make(`local:|foxs:${port}|station:|slot:/${_this.ordPath.area_tag}/${ordPath.building_tag}/${ordPath.system_tag}/${ordPath.name_tag}|bql:select name, displayname, slotPath, out.value, out, facets  from control:ControlPoint`)
//            .get(
//                function (table) {
//                    var tableStart, tableFinish;
//                    var subStart, subFinish;
//                    var component_index = 0;
//                    var total_component_index = 0;
//                    var totalTargetDevice = [];
//                    var readBqlFinish = new Date(Date.now());
//                    // $("#readPath-finish-timestamp").html(readBqlFinish.toISOString());
//                    // $("#readPath-finish-time").html((readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
//                    console.log("讀取路徑完成-花費時間", (readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
//                    table.cursor({
//                        before: function () {
//                            totalTargetDevice = [];
//                            tableStart = new Date(Date.now());
//                            $("#table-start-timestamp").html(tableStart.toISOString());
//                            render_start = new Date(Date.now());

//                        },
//                        each: function (item, index) {
//                            if (index < 1) {
//                                subStart = new Date(Date.now());
//                                $("#sub-start").html(subStart.toISOString());
//                            }
//                            $("#sub-number").html(index + 1);
//                            total_component_index = index;



//                            var target_device_number_split = this.getDisplay("slotPath").split('/');
//                            var target_device_number = target_device_number_split[8];
//                            //console.log(target_device_number);
//                            var point_name = this.getDisplay("name");
//                            var facets = this.getDisplay("facets");

//                            //依據Facets判斷回傳的內容值為何
//                            var facets_split = facets.split(',');
//                            var facets_arr = [];
//                            facets_split.forEach(function (item, index) {
//                                facets_arr.push(item.split('='));
//                            });

//                            facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

//                            var point_out_split = this.getDisplay("out").split(' ');

//                            let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

//                            if (key == undefined) {
//                                key = point_out_split[0];
//                            }

//                            var modify_target_device = {
//                                "device_number": target_device_number ? target_device_number : null,
//                                "device_number_full": this.getDisplay("slotPath").split("slot:")[1].split('/').slice(1, -1).join("_"),
//                                "point_name": point_name ? point_name : null,
//                                "value": key
//                            }
//                            totalTargetDevice.push(modify_target_device);
//                            //取得component當下就更新設備點位
//                            if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) {
//                                baja_subscribe_device_callback_func(modify_target_device);
//                            }


//                            baja.Ord.make(`local:|foxs:${port}|station:|` + this.getDisplay("slotPath"))
//                                .get()
//                                .then(function (component) {
//                                    component_index++;
//                                    var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_');
//                                    var point_name = component.getDisplayName();

//                                    // //依據Facets判斷回傳的內容值為何
//                                    // var facets_split = component.getFacets1().$cEncStr.split('|');
//                                    // var facets_arr = [];
//                                    // facets_split.forEach(function (item, index) {
//                                    //   facets_arr.push(item.split('=s:'));
//                                    // });

//                                    // var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

//                                    // var point_out_split = component.getOutDisplay().split(' ');

//                                    // let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

//                                    // if (key == undefined) {
//                                    //   key = point_out_split[0];
//                                    // }

//                                    // var modify_target_device = {
//                                    //   "device_number": target_device_number ? target_device_number : null,
//                                    //   "point_name": point_name ? point_name : null,
//                                    //   "value": key
//                                    // }

//                                    // //取得component當下就更新設備點位
//                                    // if (baja_subscribe_device_callback_func != undefined && baja_subscribe_device_callback_func != null) {
//                                    //   if (component_index == total_component_index) {
//                                    //     baja_subscribe_device_callback_func(modify_target_device, true);
//                                    //   }
//                                    //   else {
//                                    //     baja_subscribe_device_callback_func(modify_target_device);
//                                    //   }
//                                    // }

//                                    sub.subscribe({
//                                        comps: component,
//                                    });
//                                    tolSubList.push(sub);
//                                    subFinish = new Date(Date.now());
//                                    $("#sub-end").html(subFinish.toISOString());
//                                    $("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
//                                    // console.log("訂閱完成時間", (subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
//                                });
//                        },
//                        after: function () {
//                            tableFinish = new Date(Date.now());
//                            // $("#table-finish-timestamp").html(tableFinish.toISOString());
//                            // $("#table-time").html((tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
//                            //取得component當下就更新設備點位
//                            if (baja_subscribe_end_device_callback_func != undefined && baja_subscribe_end_device_callback_func != null) {
//                                baja_subscribe_end_device_callback_func(totalTargetDevice);
//                            }
//                            endPageLoading ? endPageLoading() : ""
//                            console.log("表格完成時間", (tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
//                        },
//                        limit: -1,
//                        offset: 0
//                    });
//                });
//    })
//}

/**
 * 使用者透過BQL指定路徑去訂閱Alarm
 */
function BajaSubscribeAlarmsByBql(ordPathForAlarm) {
  require(['baja!'], function (baja) {
    console.log("進入Function 準備執行BQL訂閱");
    var init_start = new Date(Date.now());
    var sub = new baja.Subscriber();
    startPageLoading ? startPageLoading() : ""
    sub.attach('changed', function (prop) {
      if (prop.getName() === 'out') {
        var sourceState = (this.$map.$map.in10.$val.$map.$map.value.$display) == 'true' ? "Offnormal" : "Normal";

        var modify_target_device = {
          "system": ordPathForAlarm.area_tag + "_" + ordPathForAlarm.building_tag + "_" + ordPathForAlarm.system_tag + "_" + ordPathForAlarm.name_tag,
          "sourceState": sourceState ? sourceState : null
        }

        if (baja_subscribe_alarm_callback_func != undefined && baja_subscribe_alarm_callback_func != null) {
          baja_subscribe_alarm_callback_func(modify_target_device);
        }
      }
    });

    //使用bql語法
    // console.log(`local:|foxs:${port}|alarm:|bql:select top 1 timestamp, sourceState, normalTime where alarmData.sourceName like '%${ordPathForAlarm.area_tag}_${ordPathForAlarm.building_tag}_${ordPathForAlarm.system_tag}_${ordPathForAlarm.name_tag}_%' order by timestamp desc`);
    baja.Ord.make(`local:|foxs:${port}|alarm:|bql:select top 1 timestamp, sourceState, alarmData, alarmData.sourceName, normalTime where alarmData.sourceName like '%${ordPathForAlarm.area_tag}_${ordPathForAlarm.building_tag}_${ordPathForAlarm.system_tag}_${ordPathForAlarm.name_tag}_%' order by timestamp desc`)
      .get(
        function (table) {
          var tableStart, tableFinish;
          var subStart, subFinish;
          var totalTargetDevice = [];
          var component_index = 0;
          var total_component_index = 0;
          var readBqlFinish = new Date(Date.now());
          console.log("讀取路徑完成-花費時間", (readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");

          table.cursor({
            before: function () {
              totalTargetDevice = [];
              tableStart = new Date(Date.now());
              render_start = new Date(Date.now());
            },
            each: function (item, index) {
              if (index < 1) {
                subStart = new Date(Date.now());
              }
              total_component_index = index;

              var sourceState = this.getDisplay("sourceState");
              //var sourceName = (item.$map.$map.alarmData$2esourceName.$display).replace('_', '/');
              var sourceNameArray = (item.$map.$map.alarmData$2esourceName.$display).split('_');
              var slotPath = sourceNameArray[0] + "/" + sourceNameArray[1] + "/" + sourceNameArray[2] + "/" + sourceNameArray[3] + "/" + sourceNameArray[4] + "/" + sourceNameArray[5] + "/" + sourceNameArray[6] + "/" + sourceNameArray[7] + "/" + sourceNameArray[8];
              var normalTime = this.getDisplay("normalTime");

              var modify_target_device = {
                "system": ordPathForAlarm.area_tag + "_" + ordPathForAlarm.building_tag + "_" + ordPathForAlarm.system_tag + "_" + ordPathForAlarm.name_tag,
                "sourceState": sourceState ? sourceState : null
              }
              totalTargetDevice.push(modify_target_device);
              //取得component當下就更新設備點位
              if (baja_subscribe_alarm_callback_func != undefined && baja_subscribe_alarm_callback_func != null) {
                baja_subscribe_alarm_callback_func(modify_target_device);
              }

              baja.Ord.make("local:|foxs:|station:|slot:/" + slotPath)
                .get()
                .then(function (component) {
                  component_index++;

                  sub.subscribe({
                    comps: component,
                  });

                  subFinish = new Date(Date.now());
                  console.log("訂閱完成時間", (subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
                });
            },
            after: function () {
              tableFinish = new Date(Date.now());
              if (baja_subscribe_end_alarm_callback_func != undefined && baja_subscribe_end_alarm_callback_func != null) {
                baja_subscribe_end_alarm_callback_func(totalTargetDevice);
              }
              endPageLoading ? endPageLoading() : ""
              console.log("表格完成時間", (tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
            },
            limit: -1,
            offset: 0
          });
        });
  });
}

/**
 * 使用者透過BQL指定路徑去訂閱 electricmeter
 */
function BajaSubscribeElectricmeterByBql(ordPathForElectricmeter) {


  require(['baja!'], function (baja) {
    //console.log("進入Function 準備執行BQL訂閱");
    startPageLoading ? startPageLoading() : ""
    var init_start = new Date(Date.now());
    var sub = new baja.Subscriber();

    sub.attach('changed', function (prop) {
      if (prop.getName() === 'out') {
        var out_value = this.getOutDisplay();
        var target_device_number = this.$parent.getDisplayName().split('_').slice(0, 5).join('_');
        var point_name = this.getDisplayName();

        //依據Facets判斷回傳的內容值為何
        var facets_split = this.getFacets1().$cEncStr.split('|');
        var facets_arr = [];
        facets_split.forEach(function (item, index) {
          facets_arr.push(item.split('=s:'));
        });

        var facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

        var point_out_split = this.getOutDisplay().split(' ');

        let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

        if (key == undefined) {
          key = point_out_split[0];
        }

        var modify_target_device = {
          "device_number": target_device_number ? target_device_number : null,
          //"device_number_full": this.$parent.getSlotPath().$names.join("_"),
          "point_name": point_name ? point_name : null,
          "value": key
        }

        if (baja_subscribe_electricmeter_callback_func != undefined && baja_subscribe_electricmeter_callback_func != null) {
          baja_subscribe_electricmeter_callback_func(modify_target_device, true); //第2參數用在平面圖,刷新畫面
        }
      }
    }, function (err) {
      console.log(err)
    });

    //使用bql語法
    // console.log(`local:|foxs:${port}|station:|slot:/${ordPathForElectricmeter.devicePath}|bql:select name, out, out.value, slotPath, facets from control:ControlPoint`);
    baja.Ord.make(`local:|foxs:${port}|station:|slot:/${ordPathForElectricmeter.devicePath}|bql:select name, out, out.value, slotPath, facets from control:ControlPoint`)
      .get(
        function (table) {
          var tableStart, tableFinish;
          var subStart, subFinish;
          var component_index = 0;
          var total_component_index = 0;
          var totalTargetDevice = [];
          var readBqlFinish = new Date(Date.now());
          //console.log("讀取路徑完成-花費時間", (readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");
          table.cursor({
            before: function () {
              totalTargetDevice = [];
              tableStart = new Date(Date.now());
              $("#table-start-timestamp").html(tableStart.toISOString());
              render_start = new Date(Date.now());

            },
            each: function (item, index) {
              if (index < 1) {
                subStart = new Date(Date.now());
                $("#sub-start").html(subStart.toISOString());
              }
              $("#sub-number").html(index + 1);
              total_component_index = index;



              var target_device_number_split = this.getDisplay("slotPath").split('/');
              var target_device_number = target_device_number_split[8];
              //console.log(target_device_number);
              var point_name = this.getDisplay("name");
              var facets = this.getDisplay("facets");

              //依據Facets判斷回傳的內容值為何
              var facets_split = facets.split(',');
              var facets_arr = [];
              facets_split.forEach(function (item, index) {
                facets_arr.push(item.split('='));
              });

              facets = facets_arr.reduce((obj, cur) => ({ ...obj, [cur[0]]: cur[1] }), {})

              var point_out_split = this.getDisplay("out").split(' ');

              let key = Object.keys(facets).find(k => facets[k] === point_out_split[0]);

              if (key == undefined) {
                key = point_out_split[0];
              }

              var modify_target_device = {
                "device_number": target_device_number ? target_device_number : null,
                //"device_number_full": this.getDisplay("slotPath").split("slot:")[1].split('/').slice(1, -1).join("_"),
                "point_name": point_name ? point_name : null,
                "value": key
              }
              totalTargetDevice.push(modify_target_device);
              //取得component當下就更新設備點位
              if (baja_subscribe_electricmeter_callback_func != undefined && baja_subscribe_electricmeter_callback_func != null) {
                baja_subscribe_electricmeter_callback_func(modify_target_device);
              }


              baja.Ord.make(`local:|foxs:${port}|station:|` + this.getDisplay("slotPath"))
                .get()
                .then(function (component) {
                  component_index++;
                  //var target_device_number = component.$parent.getDisplayName().split('_').slice(0, 5).join('_');
                  //var point_name = component.getDisplayName();

                  sub.subscribe({
                    comps: component,
                  });
                  tolSubList.push(sub);
                  subFinish = new Date(Date.now());
                  $("#sub-end").html(subFinish.toISOString());
                  $("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
                  // console.log("訂閱完成時間", (subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
                });
            },
            after: function () {
              tableFinish = new Date(Date.now());
              if (baja_subscribe_end_electricmeter_callback_func != undefined && baja_subscribe_end_electricmeter_callback_func != null) {
                baja_subscribe_end_electricmeter_callback_func(totalTargetDevice);
              }
              endPageLoading ? endPageLoading() : ""
              //console.log("表格完成時間", (tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
            },
            limit: -1,
            offset: 0
          });
        });
  })
}

// function getAlarmCountByBaja(callback) {
//     var _result = "";
//     var _index = 0;

//     require(['baja!'], function (baja) {
//         baja.Ord.make("local:|foxs:|alarm:|bql:select timestamp, ackState, alarmData, alarmData.sourceName, sourceState, uuid, alarmData.msgText, normalTime where sourceState = 'offnormal' order by timestamp desc").get()
//             .then(function (table) {
//                 return table.cursor({
//                     each: function (record) {
//                         _index++;
//                     },
//                     after: function () {
//                         _result += '{' + '"count": ' + _index;
//                         _result += '}';
//                         if (typeof callback === 'function') {
//                             callback(_result);
//                         }
//                     },
//                     limit: -1,
//                     offset: 0
//                 });
//             });
//     });
// }

// /**
//  * [首頁] 查詢復歸數量
//  * @param {any} callback
//  */
//  function getRecoverCountByBaja(callback) {
//     var _result = "";
//     var _index = 0;

//     require(['baja!'], function (baja) {
//         baja.Ord.make("local:|foxs:|alarm:|bql:select timestamp, ackState, alarmData, alarmData.sourceName, sourceState, uuid, alarmData.msgText, normalTime where normalTime != null order by timestamp desc").get()
//             .then(function (table) {
//                 return table.cursor({
//                     each: function (record) {
//                         _index++;
//                     },
//                     after: function () {
//                         _result += '{' + '"count": ' + _index;
//                         _result += '}';
//                         if (typeof callback === 'function') {
//                             callback(_result);
//                         }
//                     },
//                     limit: -1,
//                     offset: 0
//                 });
//             });
//     });
// }

// function getCheckedAckedCountByBaja(callback) {
//     var _result = "";
//     var _index = 0;

//     require(['baja!'], function (baja) {
//         baja.Ord.make("local:|foxs:|alarm:|bql:select timestamp, ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime from openAlarms where ackState ='acked' order by timestamp asc").get()
//             .then(function (table) {
//                 return table.cursor({
//                     each: function (record) {
//                         _index++;
//                     },
//                     after: function () {
//                         _result += '{' + '"count": ' + _index;
//                         _result += '}';
//                         if (typeof callback === 'function') {
//                             callback(_result);
//                         }
//                     },
//                     limit: -1,
//                     offset: 0
//                 });
//             });
//     });
// }

// function getUnCheckedAckedCountByBaja(callback) {
//     var _result = "";
//     var _index = 0;

//     require(['baja!'], function (baja) {
//         baja.Ord.make("local:|foxs:|alarm:|bql:select timestamp, ackState, alarmClass, alarmClassDisplayName, alarmValue, alarmData, alarmData.sourceName, uuid, alarmData.msgText, alarmData.numericValue, alarmData.presentValue, alarmData.status, alarmData.toState, normalTime from openAlarms where ackState ='unacked' order by timestamp asc").get()
//             .then(function (table) {
//                 return table.cursor({
//                     each: function (record) {
//                         _index++;
//                     },
//                     after: function () {
//                         _result += '{' + '"count": ' + _index;
//                         _result += '}';
//                         if (typeof callback === 'function') {
//                             callback(_result);
//                         }
//                     },
//                     limit: -1,
//                     offset: 0
//                 });
//             });
//     });
// }