/*
File name : database.js
Description : Communicates with the server to ensure that the data is up to date.
 */

const BASE_URL = "https://odari.ch/fecharts-api/";
let feData = JSON.parse(localStorage.getItem("feData"));

function isOnline() {
    if (window.cordova.platformId == "browser")
        return true;

    // Check that navigator.connection is not undefined to avoid error
    // Necessary when the app run on the browser
    const networkState = (navigator.connection) ? navigator.connection.type : null;

    if (networkState != null && networkState != "none") {
        return true;
    }
    return false;
}

// Get the data from the server or update the data in the localstorage if needed
function getOrUpdateData() {
    if (feData != null) {
        let body = new FormData();
        body.append('version', feData.version);

        fetch(BASE_URL + "update", {
            method: "POST",
            body: body,
        })
            .then(res => {
                if (res.ok) {
                    return res.json();
                } else {
                    console.log(res);
                }
            })
            .then(data => {
                updateData(data);
            })
            .catch(err => {
                console.log(err);
            });
    } else {
        // Import the data if none was found
        fetch(BASE_URL + "all")
            .then(res => {
                if (res.ok) {
                    return res.json();
                } else {
                    console.log(res);
                }
            })
            .then(data => {
                updateData(data);
            })
            .catch(err => {
                console.log(err);
            });
    }
}

// Update the data in the localstorage
function updateData(data) {
    // If the data received from the server are not empty then we can save them in the local storage
    if (data != null && Object.keys(data).length > 0) {
        localStorage.setItem("feData", JSON.stringify(data));
        feData = data;
    }

    // End of the update process, we can now display the data
    displayCharacters();
}

// Doesn't try to get or update the data if the user is not connected to the internet
if (isOnline()) {
    getOrUpdateData();
} else {
    // If the user is not connected to internet but the data are already present in the app, then we display them
    if (feData != null) {
        displayCharacters();
    } else {
        alert("Please connect to the internet to download the data");
    }

    // Create an event to get/update the data when the user goes online
    document.addEventListener("online", getOrUpdateData, false);
}
