var data = {
    loc: [],
    arc: []
}

var settings = require('../public/conf/settings.json')

var geoip = require('fast-geoip');

async function addArc(src, dest, uid, src_name, dest_name){
    const arcName = src_name + " -> " + dest_name;
    var geoSrc = undefined;
    var startLat = undefined;
    var startLng = undefined;
    var geoDest = undefined;
    var endLat = undefined;
    var endLng = undefined;
    if(!data.arc.some(x => x.src === src && x.dest === dest)) {
        if (src.includes("192.168.1.") || src.includes("127.0.0.1")) {
            startLat = round(settings.location.home.lat, settings.location.precision)
            startLng = round(settings.location.home.lng, settings.location.precision)
        } else {
            geoSrc = await geoip.lookup(src);
            startLat = round(geoSrc.ll[0], settings.location.precision)
            startLng = round(geoSrc.ll[1], settings.location.precision)
            if (geoSrc == undefined) {
                startLat = round(settings.location.home.lat, settings.location.precision)
                startLng = round(settings.location.home.lng, settings.location.precision)
            }
        }
        if (dest.includes("192.168.1.") || dest.includes("127.0.0.1")) {
            endLat = round(settings.location.home.lat, settings.location.precision)
            endLng = round(settings.location.home.lng, settings.location.precision)
        } else {
            geoDest = await geoip.lookup(dest);
            endLat = round(geoDest.ll[0], settings.location.precision)
            endLng = round(geoDest.ll[1], settings.location.precision)
            if (geoDest == undefined) {
                endLat = round(settings.location.home.lat, settings.location.precision)
                endLng = round(settings.location.home.lng, settings.location.precision)
            }
        }
        var txrx = [{src: src, dest: dest, src_name: src_name, dest_name: dest_name}];
        var dat = {
            uid: uid,
            name: arcName,
            startLat: startLat,
            startLng: startLng,
            endLat: endLat,
            endLng: endLng,
            color: settings.colors.arc.default,
            stroke: settings.sizes.arc.default,
            src: src,
            dest: dest,
            src_name: src_name,
            dest_name: dest_name,
            txrx: txrx
        }
        if(!data.arc.some(x => x.startLat === startLat && x.startLng === startLng && x.endLat === endLat && x.endLng === endLng)){
            const newUid = addLoc(arcName, startLat, startLng, uid)
            dat.uid = newUid;
            if (!data.arc.some(x => x.startLat === startLat && x.startLng === startLng && x.endLat === endLat && x.endLng === endLng)) {
                if (!data.arc.some(x => x.startLat === endLat && x.startLng === endLng && x.endLat === startLat && x.endLng === startLng)) {
                    data.arc.push(dat);
                    console.log(dat.uid)
                } else {
                    const dataIndex = data.arc.findIndex(x => x.startLat === endLat && x.startLng === endLng && x.endLat === startLat && x.endLng === startLng);
                    data.arc[dataIndex].color = settings.colors.arc.dualsender;
                    data.arc[dataIndex].txrx.push({src: dat.src, dest: dat.dest, src_name: dat.src_name, dest_name: dat.dest_name})
                }
            } else {
                const dataIndex = data.arc.findIndex(x => x.startLat === startLat && x.startLng === startLng && x.endLat === endLat && x.endLng === endLng);
                const arcuid = data.arc[dataIndex].uid;
                var loc = getLoc(arcuid)
                loc.color = settings.colors.loc.dualsender;
                loc.txrx.push({src: dat.src, dest: dat.dest, src_name: dat.src_name, dest_name: dat.dest_name})
                editLoc(loc);
            }
        }
    }
}

function round(value, precision) {
    var multiplier = Math.pow(10, precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

function addLoc(name, lat, lng, uid, src, dest, src_name, dest_name){
    var txrx = [{src: src, dest: dest, src_name: src_name, dest_name: dest_name}]
    var dat = {
        uid: uid,
        name: name,
        lat: lat,
        lng: lng,
        size: settings.sizes.loc.default,
        color: settings.colors.loc.default,
        txrx: txrx
    };

    if(!data.loc.some(x => x.lat === lat && x.lng === lng)) {
        data.loc.push(dat);
        return dat.uid
    }else{
        const dataIndex = data.loc.findIndex(obj => obj.lat === lat && obj.lng === lng);
        data.loc[dataIndex].name = data.loc[dataIndex].name + "\n" + name;
        return data.loc[dataIndex].uid
    }
}

function getLocColor(){
    return settings.colors.loc.default;
}

function getArcColor(){
    return settings.colors.arc.default;
}

function getData(){
    return data;
}

function getDisplayData(){
    var ret = data;
    ret.settings = settings
    return ret
}

function getSettigns(){
    return settings;
}

function filterUid(tofilter){
    var ret = []
    tofilter.forEach(a => {
        const {uid, ...newObj} = a;
        ret.push(newObj)
    })
    return ret
}

function getLocData(){
    return data.loc;
}

function getArcData(){
    return data.arc;
}

function getLoc(uid){
    return data.loc[data.loc.findIndex(x => x.uid === uid)];
}

function editLoc(loc){
    const dataIndex = data.loc.findIndex(x => x.uid === loc.uid);
    data.loc[dataIndex] = loc;
}

function delUids(uids){
    uids.forEach(uid => delUid(uid))
}

function delUid(uid){
    console.log("delglobe")
    console.log(uid)
    delArc(uid);
    delLoc(uid);
}

function delLoc(uid){
    data.loc = data.loc.filter(loc => loc.uid !== uid)
}

function delArc(uid){
    data.arc = data.arc.filter(arc => arc.uid !== uid)
}


module.exports = {
    addArc, addLoc, getLocData, getArcColor, getData, getArcData, getLocColor, getDisplayData, delUids, getSettigns
}