// Lector Minuto a Minuto
function createMamReader() {
    var _self;
    var MamReader = {
        updateInterval: 10000,
        lastIndex: {},
        last: 0,
        lastUpdate: 0,
        template: '',
        create: function () {
            _self = this;
            return this;
        },

        /**
         * Funcion construtora de Objeto Mam.
         * @param config objeto con variables de configuracion
         **/
        init: function (config) {
            _self.config = config;
            _self.last = parseInt(config.last, 10);
            _self.updateInterval = config.interval;
            _self.template = document.getElementById(config.template_id).innerHTML;
            document.getElementById(config.template_id).remove();
            console.log('config:', _self.config);

            if (document.getElementById('instagram-script') == undefined) {
                var script = document.createElement('script');
                script.id = 'instagram-script'
                script.src = "//www.instagram.com/embed.js";
                document.head.appendChild(script);
                script = document.createElement('script');
                script.id = 'twitter-script'
                script.src = "https://platform.twitter.com/widgets.js";
                document.head.appendChild(script);
            }

            _self.updateMam();
        },
        updateMam: function() {
            setTimeout(_self.loadIndex, this.updateInterval);
        },
        getIndexPath: function () {
            return `/${this.config.prontus}/site/artic/${this.config.ts.toString().substring(0, 8)}/mam/${this.config.ts}/index.json`;
        },
        getPostPath: function (id) {
            return `/${this.config.prontus}/site/artic/${this.config.ts.toString().substring(0, 8)}/mam/${this.config.ts}/${id}.json`;
        },
        loadIndex: function () {
            let xhr = new XMLHttpRequest();
            // Espera un máximo de 5 segundos por el archivo.
            xhr.timeout = 5000;
            xhr.open('GET', _self.getIndexPath() + '?' + Date.now(), true);
            // Handler para recibir la data.
            xhr.onload = function (e) {
                if (this.status == 200) {
                    let index = JSON.parse(xhr.response);
                    _self.processIndex(index);
                } else {
                    console.error(this.status);
                }
            }
            xhr.ontimeout = function (e) {
                console.error(e);
            }
            xhr.onerror = function (e) {
                console.error(e);
            }
            xhr.send();
            _self.updateMam();
        },

        processIndex: function (index) {
            if (_self.lastUpdate == index.update) {
                return;
            }
            _self.lastUpdate = index.update;

            let sorted = [];
            for (let id in index.mam) {
                sorted.push([parseInt(id, 10), index.mam[id]]);
            }
            sorted.sort(function (a, b) {
                return a[0] - b[0];
            });

            // relatos nuevos o con cambios
            for (let i = 0; i < sorted.length; i++) {
                // relato esta en arreglo y es mas actual se debe actualizar
                if (_self.lastIndex.mam && sorted[i][0] in _self.lastIndex.mam) {
                    if (sorted[i][1] > _self.lastIndex.mam[sorted[i][0]]) {
                        _self.removeFromList(sorted[i][0]);
                        _self.loadPost(sorted[i][0]);
                    }
                } else if (_self.last < sorted[i][0]) {
                    _self.loadPost(sorted[i][0]);
                }
            }
            _self.lastIndex = index;

            let nodes = document.getElementById(_self.config.container_id).children;
            for (let i = 0;i < nodes.length; i++) {
                if (!index.mam.hasOwnProperty(nodes[i].dataset.id)) {
                    nodes[i].remove();
                    _self.updateLast();
                }
            }
        },
        updateLast: function() {
            let nodes = document.getElementById(_self.config.container_id).children;
            _self.last = parseInt(nodes[0].dataset.id, 10);
        },
        loadPost: function(id) {
            let xhr = new XMLHttpRequest();
            // Espera un máximo de 5 segundos por el archivo.
            xhr.timeout = 5000;
            xhr.open('GET', _self.getPostPath(id) + '?' + Date.now(), true);
            // Handler para recibir la data.
            xhr.onload = function (e) {
                if (this.status == 200) {
                    let post = JSON.parse(xhr.response);
                    _self.processPost(post);
                } else {
                    console.error(this.status);
                }
            }
            xhr.ontimeout = function (e) {
                console.error(e);
            }
            xhr.onerror = function (e) {
                console.error(e);
            }
            xhr.send();
        },
        processPost: function(post) {
            // procesar template
            let template = _self.template;
            let re;
            for (let key in post) {
                if(post[key] == '') {
                    re = new RegExp('__if\\(' + key + '\\)__.*?__\/if__', 'igs');
                    template = template.replaceAll(re, '');
                } else {
                    re = new RegExp('__if\\(' + key + '\\)__(.*?)__\/if__', 'igs');
                    template = template.replaceAll(re, '$1');
                }
                if (key == 'mam_txt') {
                    // manejamos prontus insert
                    re = new RegExp('<html_insert\\s+data-code="(.*?)">[^<]+?<\/html_insert>', 'igs');
                    let array_inserts = [...post['mam_txt'].matchAll(re)];
                    for (let i= 0; i < array_inserts.length; i++) {
                        let aux = _self.decodeEntities(_self.decodeEntities(array_inserts[0][1]));
                        post['mam_txt'] = post['mam_txt'].replaceAll(array_inserts[0][0], aux);
                    }
                }
                template = template.replaceAll('__' + key +'__', post[key]);
            }

            re = new RegExp(/__.+?__/, 'gs');
            template = template.replaceAll(re, '');
            _self.addToList(template);
        },
        decodeEntities: function(text) {
            text = text.replaceAll('&amp;', '&');
            text = text.replaceAll('&lt;', '<');
            text = text.replaceAll('&gt;', '>');
            return text.replaceAll('&quot;', '"');
        },
        addToList: function(html){
            let nodes = document.getElementById(_self.config.container_id).children;
            let sorted = [];
            for (let i = 0;i < nodes.length; i++) {
                sorted.push(nodes[i]);
            }
            // crea el nodo para poder agregarlo a la lista despues
            let template = document.createElement('template');
            html = html.trim();
            template.innerHTML = html;
            sorted.push(template.content.firstChild);
            // ordenamos elementos para actualizar la lista
            sorted.sort(function (a, b) {
                return parseInt(b.dataset.id, 10) - parseInt(a.dataset.id, 10);
            });
            for (let i = 0;i < sorted.length; i++) {
                document.getElementById(_self.config.container_id).appendChild(sorted[i]);
            }
            _self.updateLast();

            // inicializa embeds de instagram
            instgrm.Embeds.process();
            twttr.widgets.load();
        },
        removeFromList: function(id) {
            let nodes = document.getElementById(_self.config.container_id).children;
            for (let i = 0;i < nodes.length; i++) {
                if (nodes[i].dataset.id == id) {
                    nodes[i].remove();
                }

            }
        }
    }

    return MamReader.create();
}

// ejemplo de uso
// let readerConfig = {
//     "prontus": "next",
//     "container_id": 'mam_container',
//     "interval": 30000,
//     "ts": 20121029150710,
//     "last": document.getElementById('loop1').dataset.id,
//     "template_id": 'tpl_mam_loop'
// };
// let reader = createMamReader();
// reader.init(readerConfig);
