import JsonRpcClient from '../plugins/jsonrpc/jquery.jsonrpc.js';
import axios from '../plugins/axios/axios.esm.js';
import Lobibox from '../plugins/notifications/js/lobibox.min.js'
import JqueryConfirm from '../plugins/confirm/js/jquery-confirm.esm.js'

export const getUrlParam = (key) => {
    let param = "";
    let query = window.location.search.substring(1);
    let vars = query.split("&");
    for (let i=0;i<vars.length;i++) {
        let pair = vars[i].split("=");
        if(pair[0] === key)
            param = pair[1]
    }
    return param;
}

export const updateSysLanguage = param => {
    if(param) {
        func("/conf/updateLangConf", param).then(result => {
            if(result.status === "success") {
                const html = document.querySelector('html');
                html.setAttribute('data-bs-language', param);
            }
        })
    }
}

//size mini normal large
export const alertMsg = (message, type = "success",delay = 5000,size = "mini") => {

    let icon = "fa-solid fa-circle-check";
    if(type === "error")
        icon = "fa-solid fa-circle-xmark";
    if(type === "info")
        icon = "fa-solid fa-circle-info ";
    if(type === "warning")
        icon = "fa-solid fa-triangle-exclamation";

    return Lobibox.notify(type, {
        pauseDelayOnHover: true,
        continueDelayOnInactiveTab: false,
        size: size,
        sound: false,
        position: 'top right',
        icon: icon,
        msg: message,
        delay: delay,
    });
}

export const confirm = (options) => {
    const jc = new JqueryConfirm();
    return jc.confirm(options);
}

export const request = (url) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, false);
    xhr.send();

    if (xhr.status === 200) {
        return JSON.parse(xhr.responseText);
    } else {
        throw new Error(xhr.statusText);
    }
}

export const queryData = (url,options= {}) => {
    return new Promise((resolve,reject)=>{
        axios.get(url,options)
            .then(response => {
                resolve(response.data);
            })
            .catch(error => {
                console.error('请求出错:', error);
                reject(error);
            });
    })
}

export const func = (url,data = []) => {
    return new Promise((resolve,reject)=>{
        axios.post('/link/relay.php', {url:url,data:data})
            .then(response => {
                resolve(response.data);
            })
            .catch(error => {
                console.error('请求出错:', error);
                reject(error);
            });
    })
}

export const axios_post = (url,data = []) => {
    return new Promise((resolve,reject)=>{
        axios.post(url, data)
            .then(response => {
                resolve(response.data);
            })
            .catch(error => {
                console.error('请求出错:', error);
                reject(error);
            });
    })
}

//encoder
export const rpc = (func, params = []) => {
    return new Promise((resolve,reject)=>{
        let jsonrpc = new JsonRpcClient({ ajaxUrl: '/RPC' });
        jsonrpc.call(func, params, data => { resolve(data); }, error =>{ console.log(error);reject(error); });
    })
}

//netManager
export const rpc2 = (func, params = []) => {
    return new Promise((resolve,reject)=>{
        let jsonrpc = new JsonRpcClient({ ajaxUrl: '/RPC2' });
        jsonrpc.call(func, params, data => { resolve(data); }, error =>{ console.log(error);reject(error); });
    })
}

//port
export const rpc3 = (func, params = []) => {
    return new Promise((resolve,reject)=>{
        let jsonrpc = new JsonRpcClient({ ajaxUrl: '/RPC3' });
        jsonrpc.call(func, params, data => { resolve(data); }, error =>{ console.log(error);reject(error); });
    })
}

//mqtt
export const rpc4 = (func, params = []) => {
    return new Promise((resolve,reject)=>{
        let jsonrpc = new JsonRpcClient({ ajaxUrl: '/RPC4' });
        jsonrpc.call(func, params, data => { resolve(data); }, error =>{ console.log(error);reject(error); });
    })
}

//onvif
export const rpc5 = (func, params = []) => {
    return new Promise((resolve,reject)=>{
        let jsonrpc = new JsonRpcClient({ ajaxUrl: '/RPC5' });
        jsonrpc.call(func, params, data => { resolve(data); }, error =>{ console.log(error);reject(error); });
    })
}

// monitor
export const rpc6 = (func, params = []) => {
    return new Promise((resolve,reject)=>{
        let jsonrpc = new JsonRpcClient({ ajaxUrl: '/RPC6' });
        jsonrpc.call(func, params, data => { resolve(data); }, error =>{ console.log(error);reject(error); });
    })
}


export const checkFileExists = (url) => {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('HEAD', url);
        xhr.onload = () => {
            if (xhr.status === 200) {
                resolve(true);
            } else {
                resolve(false);
            }
        };
        xhr.onerror = () => {
            reject(new Error('请求出错'));
        };
        xhr.send();
    });
}

export const extend = (target, ...sources) => {
    if (!target) return {};

    sources.forEach(source => {
        if (source) {
            Object.assign(target, source);
        }
    });

    return target;
}

export const clearReactiveObject = (reactiveObj) => {
    const keys = Object.keys(reactiveObj);
    keys.forEach((key) => {
        delete reactiveObj[key];
    });
};

export const clearReactiveArray = (reactiveArray) => {
    reactiveArray.splice(0);
};

export const deepCopy = (obj) => JSON.parse(JSON.stringify(obj));

export const popover = (ele,param) => {
    if(ele === null || ele === undefined)
        return {};
    if(param.content.includes("<cn>")) {
        const html = document.querySelector('html');
        let lang = html.getAttribute('data-bs-language');
        if(lang === null)
            lang = "cn";
        const regex = new RegExp(`<${lang}>(.*?)<\/${lang}>`);
        param.content = param.content.match(regex)[1];
    }
    return new bootstrap.Popover(ele, param)
}

export const formatDate =  (fmt,date = new Date()) => {
    let o = {
        "M+": date.getMonth() + 1,
        "d+": date.getDate(),
        "h+": date.getHours(),
        "m+": date.getMinutes(),
        "s+": date.getSeconds(),
        "q+": Math.floor( ( date.getMonth() + 3 ) / 3 ),
        "S": date.getMilliseconds()
    };
    if ( /(y+)/.test( fmt ) ) fmt = fmt.replace( RegExp.$1, ( date.getFullYear() + "" ).substr( 4 - RegExp.$1.length ) );
    for ( let k in o )
        if ( new RegExp( "(" + k + ")" ).test( fmt ) ) fmt = fmt.replace( RegExp.$1, ( RegExp.$1.length == 1 ) ? ( o[ k ] ) : ( ( "00" + o[ k ] ).substr( ( "" + o[ k ] ).length ) ) );
    return fmt;
}

export const deepEqualIgnoreProps = (obj1, obj2, ignoreProps) => {
    if (obj1 === obj2) {
        return true;
    }
    if (typeof obj1 !== 'object' || typeof obj2 !== 'object' || obj1 === null || obj2 === null) {
        return false;
    }
    const keys1 = Object.keys(obj1).filter(key => !ignoreProps.includes(key));
    const keys2 = Object.keys(obj2).filter(key => !ignoreProps.includes(key));
    if (keys1.length !== keys2.length) {
        return false;
    }
    for (const key of keys1) {
        if (!keys2.includes(key) || !deepEqualIgnoreProps(obj1[key], obj2[key], ignoreProps)) {
            return false;
        }
    }
    return true;
}

export const rebootConfirm = (msg) => {
    confirm( {
        title: '<cn>重启</cn><en>Reboot</en>',
        content: '<cn>'+msg+'</cn><en>Reboot immediately?</en>',
        buttons: {
            ok: {
                text: "<cn>确认重启</cn><en>Confirm</en>",
                btnClass: 'btn-primary',
                keys: [ 'enter' ],
                action: function () {
                    func("/system/systemReboot");
                }
            },
            cancel: {
                text: "<cn>取消</cn><en>Cancel</en>",
                action: function () {
                    console.log( 'the user clicked cancel' );
                }
            }
        }
    } );
}

export const resetConfirm = () => {
    confirm( {
        title: '<cn>还原</cn><en>Reset</en>',
        content: '<cn>是否还原全部设置？</cn><en>Reset all config to default and reboot immediately?</en>',
        buttons: {
            ok: {
                text: "<cn>确认</cn><en>Confirm</en>",
                btnClass: 'btn-primary',
                keys: [ 'enter' ],
                action: function () {
                    func("/system/systemReset");
                }
            },
            cancel: {
                text: "<cn>取消</cn><en>Cancel</en>",
                action: function () {
                    console.log( 'the user clicked cancel' );
                }
            }

        }
    } );
}

export const splitArray = (array,count) => {
    return Array.from({ length: Math.ceil(array.length / count) }, (_, index) =>
        array.slice(index * count, index * count + count)
    );
}

export const isEmpty = str => {
    return (!str || str.trim() === "");
}

export const swap = (array, index1, index2) => {
    const temp = array[index1];
    array[index1] = array[index2];
    array[index2] = temp;
    console.log(array,index1,index2);
}

export const formatTime = (msec, format="hh:mm:ss") => {
    const seconds = Math.floor((msec / 1000) % 60);
    const minutes = Math.floor((msec / (1000 * 60)) % 60);
    const hours = Math.floor((msec / (1000 * 60 * 60)) % 24);
    const days = Math.floor(msec / (1000 * 60 * 60 * 24));

    const formattedTime = format
        .replace('dd', String(days).padStart(2, '0'))
        .replace('hh', String(hours).padStart(2, '0'))
        .replace('mm', String(minutes).padStart(2, '0'))
        .replace('ss', String(seconds).padStart(2, '0'));

    return formattedTime;
}






