/**
 * Created by Amila Sankha on 03/08/2018.
 */


var cacheDataConf = {};
const HOUR_TO_MILLISECOND = 60 * 60 * 1000;

setInterval(evaluateCacheDataSet, 1 * 60 * 1000);
console.log("worker start...");

self.addEventListener('message', function (event) {
    let msg = event.data;
    if (msg.type === 'init') {
        this.setCacheDataConf(msg);

    } else if (msg.type === 'update') {
        this.updateCacheDataConf(msg.key, msg.data);

    } else if (msg.type === 'delete') {
        this.deleteCacheDataConf(msg.key);
    }

}, false);


function setCacheDataConf(msg) {
    this.cacheDataConf = msg.data;
    this.evaluateCacheDataSet();
}

function updateCacheDataConf(key, value) {
    this.cacheDataConf[key] = value;
}

function deleteCacheDataConf(key) {
    delete this.cacheDataConf[key];
}

function evaluateCacheDataSet() {
    for (let key in cacheDataConf) {
        if (cacheDataConf.hasOwnProperty(key)) {
            eveluateCacheData(key, cacheDataConf[key]);
        }
    }
}

function eveluateCacheData(key, data) {
    let now = new Date().getTime();
    if (data.hasOwnProperty("exp_time")) {
        if (data.exp_time < now) {
            removeDataFromCache(key,data);
            return;
        }
    }
    if (data.hasOwnProperty("frequency")) {
        let frequency = data.frequency;
        let nextUpdateTime = data.last_update_time + frequency * HOUR_TO_MILLISECOND;
        if (nextUpdateTime < now) {
            updateDataInCache(key, data);
        }
    }
}

function removeDataFromCache(key,data) {
    let msg = {};
    msg['type'] = 'remove';
    msg['key'] = key;
    msg['data'] = data;
    sendMessageToCacheService(msg);
}

function updateDataInCache(key, data) {
    let type;
    if (data.type === 'auto_fetch_data'){
        type = 'update';
    }else if (data.type === 'fetch_data'){
        type = 're-try';
    }
    let msg = {};
    msg['type'] = type;
    msg['key'] = key;
    msg['data'] = data;
    sendMessageToCacheService(msg);
}

function sendMessageToCacheService(msg) {
    self.postMessage(msg);
}



