/**
 * Handle progress bar on /download
 * 
 */

checkMessages()

// page map to notification status
const messageTypes = {
    "download": ["message:download", "message:add", "message:rescan"],
    "channel": ["message:subchannel"],
    "channel_id": ["message:playlistscan"],
    "playlist": ["message:subplaylist"]
}

// start to look for messages
function checkMessages() {
    var notifications = document.getElementById("notifications");
    if (notifications) {
        var dataOrigin = notifications.getAttribute("data");
        getMessages(dataOrigin);
    }
}

// get messages for page on timer
function getMessages(dataOrigin) {
    fetch('/progress/').then(response => {
        return response.json();
    }).then(responseData => {
        var messages = buildMessage(responseData, dataOrigin);
        if (messages.length > 0) {
            // restart itself
            setTimeout(function() {
                getMessages(dataOrigin);
            }, 3000);
        };
    });
}

// make div for all messages, return relevant
function buildMessage(responseData, dataOrigin) {
    // filter relevan messages
    var allMessages = responseData["messages"];
    var messages = allMessages.filter(function(value) {
        return messageTypes[dataOrigin].includes(value["status"])
    }, dataOrigin);
    // build divs
    var notificationDiv = document.getElementById("notifications");
    var nots = notificationDiv.childElementCount;
    notificationDiv.innerHTML = "";
    for (let i = 0; i < messages.length; i++) {
        var messageData = messages[i];
        var messageStatus = messageData["status"];
        var messageBox = document.createElement("div");
        var title = document.createElement("h3");
        title.innerHTML = messageData["title"];
        var message = document.createElement("p");
        message.innerHTML = messageData["message"];
        messageBox.appendChild(title);
        messageBox.appendChild(message);
        messageBox.classList.add(messageData["level"], "notification");
        notificationDiv.appendChild(messageBox);
        if (messageStatus === "message:download") {
            checkDownloadIcons();
        };
    };
    // reload page when no more notifications
    if (nots > 0 && messages.length === 0) {
        location.reload();
    };
    return messages
}

// check if download icons are needed
function checkDownloadIcons() {
    var iconBox = document.getElementById("downloadControl");
    if (iconBox.childElementCount === 0) {
        var downloadIcons = buildDownloadIcons();
        iconBox.appendChild(downloadIcons);
    };
}

// add dl control icons
function buildDownloadIcons() {
    var downloadIcons = document.createElement('div');
    downloadIcons.classList = 'dl-control-icons';
    // stop icon
    var stopIcon = document.createElement('img');
    stopIcon.setAttribute('id', "stop-icon");
    stopIcon.setAttribute('title', "Stop Download Queue");
    stopIcon.setAttribute('src', "/static/img/icon-stop.svg");
    stopIcon.setAttribute('alt', "stop icon");
    stopIcon.setAttribute('onclick', 'stopQueue()');
    // kill icon
    var killIcon = document.createElement('img');
    killIcon.setAttribute('id', "kill-icon");
    killIcon.setAttribute('title', "Kill Download Queue");
    killIcon.setAttribute('src', "/static/img/icon-close.svg");
    killIcon.setAttribute('alt', "kill icon");
    killIcon.setAttribute('onclick', 'killQueue()');
    // stich together
    downloadIcons.appendChild(stopIcon);
    downloadIcons.appendChild(killIcon);
    return downloadIcons
}
