let baja_subscribe_device_callback_func; //設定BQL訂閱之後要回傳的Function
var ordPath; //當前點選選單的tag,用來抓出設備路徑,例如:旅館棟->H,消防偵煙器->F3
window.tolSubList = [];
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 BajaSubscribeDevicesByBql() {
   
    
    require(['baja!'], function (baja) {
        console.log("進入Function 準備執行BQL訂閱");
        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,
                    "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:|station:|slot:/TPE/${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:|station:|slot:/TPE/${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 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 () {
                            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[target_device_number_split.length - 2];
                            //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,
                                "point_name": point_name ? point_name : null,
                                "value": key
                            }

                            //取得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:|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");
                            console.log("表格完成時間", (tableFinish.getTime() - tableStart.getTime()) / 1000 + "sec");
                        },
                        limit: -1,
                        offset: 0
                    });
                });
    });
}

function getElevatorInfoByBaja(path, callback) {
    var _result = "";
    var _ss = '{';
    var _index = 0;
    //
    require(['baja!'], function (baja) {
        baja.Ord.make("local:|foxs:|station:|slot:/TPE/B1/ELEV/EL/R2F/NA/ELEV1/N1|bql:select name, displayName, out, out.value, slotPath, parent.name as 'device_number' from control:ControlPoint where name = 'CP' or name = 'RD' or name = 'DS' or name = 'ST' or name = 'LOAD' or name = 'MID' or name = 'HAND' or name = 'IND' or name = 'MD' or name = 'DNO'").get()
            .then(function (table) {
                return table.cursor({
                    each: function (record) {
                        var item = null;
                        var value = null;
                        if (record.get('name') == "CP") { 
                            item = "floor";
                            value = record.get('out').get('value');
                        }
                        else if (record.get('name') == "RD") { //UP or DOWN
                            item = "direction";
                            value = record.get('out').get('value');
                        }
                        else if (record.get('name') == "DS") {
                            item = "door_state";
                            value = record.get('out').get('value') == true ? "OPEN" : "CLOSE";;
                        }
                        else if (record.get('name') == "ST") {
                            item = "running_status";
                            value = record.get('out').get('value');
                        }
                        else if (record.get('name') == "LOAD") {
                            item = "loading";
                            value = record.get('out').get('value');
                        }
                        else if (record.get('name') == "MID") {
                            item = "maintenance";
                            value = record.get('out').get('value');
                        }
                        else if (record.get('name') == "HAND") {
                            item = "manual";
                            value = record.get('out').get('value');
                        }
                        else if (record.get('name') == "IND") {
                            item = "independent";
                            value = record.get('out').get('value');
                        }
                        else if (record.get('name') == "MD") {
                            item = "vip";
                            value = record.get('out').get('value');
                        }
                        else if (record.get('name') == "DNO") {
                            item = "automatic";
                            value = record.get('out').get('value');
                        }
                        
                        if (item != null && item != "")
                        {
                            if (_index == 0)
                                _ss += '{"item":"' + item + '", "value":"' + value + '"}';
                            else
                                _ss += ',{"item":"' + item + '", "value":"' + value + '"}';
                            _index++;
                        }

                        
                    },
                    after: function () {
                        _result += '{' + '"count": ' + _index + ', "data":[';
                        _result += _ss;
                        _result += ']}';
                        if (typeof callback === 'function') {
                            callback(_result);
                        }
                    }
                });
            });
    });
}



// baja.Ord.make('ip:greencloud.fic.com.tw|foxs:|station:|slot:/Arena/H/F3|bql:select name, displayname, slotPath, out.value, out from control:ControlPoint')
// // baja.Ord.make('ip:greencloud.fic.com.tw|foxs:|station:|slot:/Arena/H/E1/B1F/TestData/H_E1_B1F_TestData_Data|bql:select slotPath,out.value from control:NumericWritable')
//     .get(
//         function (table) {
//             var tableStart, tableFinish;
//             var subStart, subFinish;
//             var readBqlFinish = new Date(Date.now());
//             $("#readPath-finish-timestamp").html(readBqlFinish.toISOString());
//             $("#readPath-finish-time").html((readBqlFinish.getTime() - init_start.getTime()) / 1000 + "sec");

//             table.cursor({
//                 before: function () {
//                     tableStart = new Date(Date.now());
//                     $("#table-start-timestamp").html(tableStart.toISOString());

//                     subStart = new Date(Date.now());
//                     $("#sub-start-timestamp").html(subStart.toISOString());

//                     render_start = new Date(Date.now());
//                 },
//                 each: function (item, index) {

//                     // console.log("local:|foxs:|station:|" + this.getDisplay("slotPath"));
//                     baja.Ord.make("local:|foxs:|station:|" + this.getDisplay("slotPath"))
//                         .get()
//                         .then(function (component) {
//                             //紀錄 未render前花費約5秒
//                             $("#render-points").append(`
//                                 <div>
//                                     <label>${component.getDisplayName()}</label>
//                                     <div id="${component.getDisplayName()}-value" style="text-align: center;">${component.getOutDisplay()}</div>
//                                 </div>
//                             `);

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

//                             $("#sub-point-name").html(component.getDisplayName());

//                             subFinish = new Date(Date.now());
//                             $("#sub-finish-timestamp").html(subFinish.toISOString()); $("#sub-finish-timestamp").html(subFinish.toISOString());
//                             $("#sub-time").html((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");
//                 },
//                 limit: -1,
//                 offset: 0
//             });
//         })