var REST_PARAMS = REST_PARAMS || {};
REST_PARAMS.api = "wp-json/wp/v2";
REST_PARAMS.posts = REST_PARAMS.api + "/posts?";
REST_PARAMS.pages = REST_PARAMS.api + "/pages?";
REST_PARAMS.max_page = 10;
REST_PARAMS.per_page = 'per_page=' + REST_PARAMS.max_page;

function aggiornaPages() {
    var jsonurl = weburl + REST_PARAMS.pages;
    $.ajax({
        dataType: "json",
        url: jsonurl,
        success: function (data) {
            $.each(data, function (key, val) {
                var id = val.id;
                var time = val.modified;
                var title = val.title.rendered;
                var content = val.content.rendered;
                FONTE.dbHandler.executeSql('INSERT INTO xm24_pages VALUES (?,?,?,?)', [id, title, time, content], function (resultSet) {
                    console.log('resultSet.insertId: ' + resultSet.insertId);
                    console.log('resultSet.rowsAffected: ' + resultSet.rowsAffected);
                }, function (error) {
                    console.log('INSERT error: ' + error.message);
                });
            });
        },
        error: JSONErrorHandler
    });
}

function aggiornaSingleCategory(category) {
    //resetta la variabile d'errore per le chiamate ajax asincrone
    FONTE.ajaxError = false;

    var jsonurl = weburl + REST_PARAMS.posts + REST_PARAMS.per_page;

    var storage = window.localStorage;
    var lastUpdate = storage.getItem('db_update_date');

    if (lastUpdate) jsonurl += "&filter[date_query][column]=post_modified_gmt&filter[date_query][after]=" + lastUpdate;
    getSinglePageRecur(jsonurl, category, 1);
}

function resetAndUpdate() {
    var storage = window.localStorage;
    //resetto la data e droppo le tabelle
    storage.setItem('db_update_date', null);
    FONTE.dbHandler.executeSql('DROP TABLE IF EXISTS xm24_posts;');
    FONTE.dbHandler.executeSql('CREATE TABLE IF NOT EXISTS xm24_posts (id INTEGER PRIMARY KEY, title, date, category, post)');
    postsUpdate();
}

function update() {
    FONTE.dbHandler.executeSql('SELECT COUNT(*) AS numPosts FROM xm24_posts', [], function (resultSet) {
        var numPosts = resultSet.rows.item(0).numPosts;
        if (numPosts < 300) { //questo numero e' scelto in maniera arbitraria, ricordati Cri.
            resetAndUpdate();
        } else {
            postsUpdate();
        }
    });
}

function postsUpdate(categories) {
    $(FONTE.contentListClass).empty();

    var storage = window.localStorage;
    var type = getObjKey(FONTE.categories, categories);
    var jsonurl = weburl + REST_PARAMS.posts + REST_PARAMS.per_page + "&categories=" + categories.join(',');
    
    FONTE.updatedCategoriesCount = 0;
    FONTE.updatedPostsCount = 0;
    FONTE.neededPostsCount = 0;
    
    FONTE.ajaxError = false;
    
    var lastUpdate = storage.getItem('db_update_' + type + '_date');
    if (lastUpdate) 
        jsonurl += "&after=" + lastUpdate;
        //jsonurl += "&filter[date_query][column]=post_modified_gmt&filter[date_query][after]=" + lastUpdate;
        
    var firstTime = storage.getItem('db_last_' + type + '_firsttime');
    if (firstTime === null) storage.setItem('db_last_' + type + '_firsttime', 'yes');
    if (firstTime == 'yes') storage.setItem('db_last_' + type + '_firsttime', 'no');
    
    getLastSinglePageRecur(jsonurl, 1, categories);
}

var updateLocalStorageDate = function(type){    
    var date = new Date();
    
    var currentUpdate = date.getFullYear() + '-' + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + ('0' + date.getDate()).slice(-2);
    currentUpdate += 'T' + ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + ':' + ('0' + date.getSeconds()).slice(-2);
    
    var lastUpdate = window.localStorage.getItem('db_update_' + type + '_date');
    
    window.localStorage.setItem('db_update_' + type + '_date', currentUpdate);
    window.localStorage.setItem('db_last_' + type + '_date', lastUpdate);
};

var getPrevNews = function(div, categories, page) {
    var storage = window.localStorage;
    var type = getObjKey(FONTE.categories, categories);
    var jsonurl = weburl + REST_PARAMS.posts + REST_PARAMS.per_page + "&categories=" + FONTE.categories[type].join(',');
    
    FONTE.updatedCategoriesCount = 0;
    FONTE.updatedPostsCount = 0;
    FONTE.neededPostsCount = 0;
    
    var oldest_date = window.localStorage.getItem('db_oldest_' + type + '_date');
    if (oldest_date) 
        jsonurl += "&before=" + oldest_date;
    
    getPrevSinglePageRecur(jsonurl, 1, FONTE.categories[type]);
};

function loadMore(type) {
    var categories = FONTE.categories[type];
    
    renderPrevNews(FONTE.contentListClass, categories, FONTE.page_loaded[type], function(){ 
        getPrevNews(FONTE.contentListClass, categories, FONTE.page_loaded[type]);
    });
}

function getPrevSinglePageRecur(url, pagenum, categories) {
    $.mobile.loading('show');
    var type = getObjKey(FONTE.categories, categories);
    
    console.log('url:'+url);
    $.ajax({
        dataType: "json",
        url: url + "&page=" + pagenum,
        success: function (data, textStatus, jqXHR) {
            var totalPages = jqXHR.getResponseHeader('X-WP-TotalPages');
                            
            FONTE.neededPostsCount += data.length;
            if (FONTE.neededPostsCount === 0) {
                $.mobile.loading('hide');
                toastr.info('Non ci sono altri alticoli da visualizzare in questa sezione');
                updateLocalStorageDate(type);
            }
            
            var n_error = 0;
            var oldest_date = window.localStorage.getItem('db_oldest_' + type + '_date');
            $.each(data, function (key, val) {
                var id = val.id;
                var time = val.date;
                var title = val.title.rendered;
                var tags = val.tags;
                var postCategories = val.categories;
                var blob = JSON.stringify(val);
                
                FONTE.dbHandler.executeSql('INSERT OR REPLACE INTO xm24_posts VALUES (?,?,?,?)', [id, title, time, blob], function (resultSet) {
                    FONTE.updatedPostsCount++;
                    oldest_date = time;
                    if (n_error + FONTE.updatedPostsCount >= FONTE.neededPostsCount) {
                        updateLocalStorageDate(type);
                        window.localStorage.setItem('db_oldest_' + type + '_date', oldest_date);
                        toastr.info('Caricati altri ' + FONTE.updatedPostsCount + ' articoli.');
                        loadMore(type);
                    } //manca il caso in cui sono stati cancellati dei post online, vanno cancellati anche dall'app.
                }, function (error) {
                    n_error++;
                    if (n_error + FONTE.updatedPostsCount >= FONTE.neededPostsCount && FONTE.updatedPostsCount > 0 ) {
                        updateLocalStorageDate(type);
                        window.localStorage.setItem('db_oldest_' + type + '_date', oldest_date);
                        toastr.info('Caricati altri ' + FONTE.updatedPostsCount + ' articoli.');
                        loadMore(type);
                    }
                });

                $.each(postCategories, function (key, val) {
                    insertOrUpdateCatToPost(id, val);
                });
            });
        },
        error: JSONErrorHandler
    });
}

function getLastSinglePageRecur(url, pagenum, categories) {
    // resetto la paginazione di #info e #ilove
    FONTE.page_loaded.info = 0;
    FONTE.page_loaded.ilove = 0;

    var type = getObjKey(FONTE.categories, categories);
    
    console.log('url:'+url);
    $.ajax({
        dataType: "json",
        url: url + "&page=" + pagenum,
        success: function (data, textStatus, jqXHR) {
            var totalPages = jqXHR.getResponseHeader('X-WP-TotalPages');
                            
            FONTE.neededPostsCount += data.length;
            if (FONTE.neededPostsCount === 0) {
                toastr.info('Nessun nuovo articolo.');
                updateLocalStorageDate(type);
                if(FONTE.page_loaded[type] === 0) {
                    renderLastNews(FONTE.contentListClass, categories);
                }
            }
            
            var n_error = 0;
            var oldest_date = window.localStorage.getItem('db_oldest_' + type + '_date');
            var older_date = null;
            $.each(data, function (key, val) {
                var id = val.id;
                var time = val.date;
                var title = val.title.rendered;
                var tags = val.tags;
                var postCategories = val.categories;
                var blob = JSON.stringify(val);
                
                FONTE.dbHandler.executeSql('INSERT OR REPLACE INTO xm24_posts VALUES (?,?,?,?)', [id, title, time, blob], function (resultSet) {
                    FONTE.updatedPostsCount++;
                    console.log('Voci aggiornate: ' + FONTE.updatedPostsCount);
                    older_date = time;
                    if (n_error + FONTE.updatedPostsCount >= FONTE.neededPostsCount) {
                        updateLocalStorageDate(type);
                        if(! oldest_date)
                            window.localStorage.setItem('db_oldest_' + type + '_date', older_date);
                            
                        toastr.info('Ci sono ' + FONTE.updatedPostsCount + ' nuovi articoli.');
                        renderLastNews(FONTE.contentListClass, categories);
                    } //manca il caso in cui sono stati cancellati dei post online, vanno cancellati anche dall'app.
                }, function (error) {
                    n_error++;
                    if (n_error + FONTE.updatedPostsCount >= FONTE.neededPostsCount && FONTE.updatedPostsCount > 0 ) {
                        updateLocalStorageDate(type);
                        if(! oldest_date)
                            window.localStorage.setItem('db_oldest_' + type + '_date', older_date);
                            
                        toastr.info('Aggiornati ' + FONTE.updatedPostsCount + ' nuovi articoli.');
                        renderLastNews(FONTE.contentListClass, categories);
                    }
                });
                
                // $.each(tags, function (key, val) {
                //     aggiornaTagsToPosts(id, val);
                // });
                
                $.each(postCategories, function (key, val) {
                    insertOrUpdateCatToPost(id, val);
                });
            });

            // if (data.length === 0) {
            //     renderLastNews(FONTE.contentListClass, categories);
            // }
        },
        error: JSONErrorHandler
    });
}
