Source: ui/user_progress.js

/* Attempt at creating a way for users to follow their progress */

require("../rur.js");
require("../utils/key_exist.js");
require("./../translator.js");
var record_id = require("./../../lang/msg.js").record_id;
var remove_fileInput_listener = require("../listeners/onclick.js").remove_fileInput_listener;

function update_world_selector (name, remove) {
    var options = $("#select-world")[0].options;
    for (var i=0; i<options.length; i++) {
        if (remove) {
            if (RUR.strip_checkmark(options[i].innerHTML) == name) {
                options[i].innerHTML = name;
                break;
            }
        } else if (options[i].innerHTML == name) {
            options[i].innerHTML = name + RUR.CHECKMARK;
            break;
        }
    }
}

RUR.strip_checkmark = function (name) {
    return name.replace(RUR.CHECKMARK, '');
};

/* Add a checkmark only if the world has been solved.
*/
RUR.add_checkmark = function (name) {
    var menu = RUR.state.user_progress[RUR.state.current_menu];
    if (name.substring(0,11) === "user_world:"){
        return name;
    }
    if (menu !== undefined && menu.includes(name)) {
        return name += RUR.CHECKMARK;
    }
    return name;
};

RUR.update_progress = function(){
    var world_name, world = RUR.get_current_world();
    if (world.goal === undefined && world.post === undefined) {
        return;   // this world does not have anything that needs to be solved.
    }
    world_name = RUR.state.world_name;
    if (world_name.substring(0,11) === "user_world:"){
        return;
    }

    RUR.utils.ensure_key_for_array_exists(RUR.state.user_progress, RUR.state.current_menu);
    if (!RUR.state.user_progress[RUR.state.current_menu].includes(world_name)) {
        RUR.state.user_progress[RUR.state.current_menu].push(world_name);
    }
    update_world_selector(world_name);
    localStorage.setItem("user-progress", JSON.stringify(RUR.state.user_progress));
};

function retrieve_progress () {
    var progress = localStorage.getItem("user-progress");
    if (progress) {
        try {
            RUR.state.user_progress = JSON.parse(progress);
        } catch (e) {
            RUR.state.user_progress = {};
        }
    }
}

retrieve_progress();


function save_progress() {
    var blob, filename, filetype, progress;

    progress = JSON.stringify(RUR.state.user_progress);
    filetype = "text/javascript;charset=utf-8";
    filename = "progress.json";

    blob = new Blob([progress], {type: filetype});
    saveAs(blob, filename, true);
}


function import_progress () {
    var fileInput;
    remove_fileInput_listener();
    $("#fileInput").click();
    fileInput = document.getElementById('fileInput');

    fileInput.addEventListener('change', function(e) {
        var file, reader;
        reader = new FileReader();
        reader.onload = function(e) {
            var content = reader.result, progress;
            try {
                progress = JSON.parse(content);
            } catch (e2) {
                alert(RUR.translate("Cannot parse progress file."));
                return;
            }
            Object.assign(RUR.state.user_progress, progress);
            localStorage.setItem("user-progress", JSON.stringify(RUR.state.user_progress));
            refresh_world_selector();
            fileInput.value = '';
        };

        file = fileInput.files[0];
        reader.readAsText(file);
    });
}

function refresh_world_selector() {
    "use strict";
    var badges, menu, world_name, options = $("#select-world")[0].options;
    menu = RUR.state.current_menu;
    badges = RUR.state.user_progress[menu];
    if (badges === undefined) {
        return;
    }
    for (var i=0; i<options.length; i++) {
        world_name = RUR.strip_checkmark(options[i].innerHTML);
        if (badges.includes(world_name)) {
            options[i].innerHTML = world_name + RUR.CHECKMARK;
        }
    }
}

/** @function unmark_task
 * @memberof RUR
 * @instance
 * @summary Removes the tasks from the list of completed tasks. If the task
 * cannot be found, the function will fail silently.
 *
 * @param {string} name The name of task as it appears in the world selector, 
 * like `Home 1`.
 *
 */

RUR.unmark_task = function (name) {
    var tasks, remove=true;
    tasks = RUR.state.user_progress[RUR.state.current_menu];
    if (tasks === undefined) {
        return;
    }
    if (!tasks.includes(name)) {
        return;
    } 
    tasks.splice(tasks.indexOf(name), 1);
    RUR.state.user_progress[RUR.state.current_menu] = tasks;
    update_world_selector(name, remove);
    localStorage.setItem("user-progress", JSON.stringify(RUR.state.user_progress));
};


record_id('save-progress-btn', "SAVE PROGRESS");
record_id('import-progress-btn', "IMPORT PROGRESS");
$(document).ready(function() {
    $("#save-progress-btn").on("click", function (evt) {
        save_progress();
    });
    $("#import-progress-btn").on("click", function (evt) {
        import_progress();
        try {
            $("#more-menus").dialog("close");
        } catch (e) {}
    });
});