// from config.js
/* global urlVersions */

var urlFileUpload = "https://localhost:8443/api/1.0/papers/uploadTmpFile";

/* exported MessageTypesEnum */
var MessageTypesEnum = {
    INFO: "info",
    SUCCESS: "success",
    WARNING: "warning",
    DANGER: "danger"
};
Object.freeze(MessageTypesEnum);

function isEmpty(value) {
    if (typeof  value === "function") {
        return false;
    }
    return (value == null || value.length === 0);
}

/* exported showFeedbackMessage */
function showFeedbackMessage(message, type) {
    var drawMessage = function (message, type) {
        var li = $(
            "<li class=\"alert alert-" + type + "\">" +
            "<span>" + message + "</span>" +
            "</li>"
        );
        li.click(function () {
            $(this).remove();
        });
        messageDiv.append(li);
    };

    var liveTimeMs = 15000;
    var messageDiv = $("#messages");
    if (isEmpty(message)) {
        messageDiv.html("");
        return;
    }
    drawMessage(message, (isEmpty(type) || isEmpty(MessageTypesEnum[type.toUpperCase()]) ?
        MessageTypesEnum.INFO : type));
    setTimeout(function () {
        messageDiv.find("li").first().remove();
    }, liveTimeMs);
}

/* exported errorHandler */
function errorHandler(response, callBack, errorCallBack) {
    if (isEmpty(response)) {
        showFeedbackMessage("Empty response", MessageTypesEnum.DANGER);
        return;
    }
    if (!isEmpty(response.error)) {
        // TODO: add l10n
        // showFeedbackMessage(response.error.code + ": " + response.error.message, MessageTypesEnum.DANGER);
        if (!isEmpty(errorCallBack)) {
            errorCallBack(response.data);
        }
        throw response.error.code + ": " + response.error.message +
        " / Details: " + response.error.data;
    }
    if (!isEmpty(callBack)) {
        if (isLoginPageResponse(response)) {
            window.location.href = "/";
        } else {
            callBack(response.data);
        }
    }
}

function isLoginPageResponse(response) {
    return (typeof response) === 'string' && response.indexOf("<!DOCTYPE html>") >= 0;
}

/* exported getFromRest */
function getFromRest(url, callBack, errorCallBack) {
    $.ajax({
        url: url,
        cache: false,
        success: function (response) {
            errorHandler(response, callBack, errorCallBack);
        }
    });
}

/* exported getFromRestWithVersion */
function getFromRestWithVersion(url, callBack, errorCallBack) {
    getFromRestWithVersionAndParams(url, "", callBack, errorCallBack);
}

/* exported getFromRestWithVersionAndParams */
function getFromRestWithVersionAndParams(url, params, callBack, errorCallBack) {
    getCurrentVersion(function (version) {
        $.ajax({
            url: url + "?versionId=" + version + params,
            cache: false,
            success: function (response) {
                errorHandler(response, callBack, errorCallBack);
            }
        });
    });
}

/* exported postToRest */
function postToRest(url, postData, callBack, completeCallback, errorCallBack) {
    $.ajax({
        url: url,
        cache: false,
        dataType: "json",
        data: postData,
        contentType: "application/json; charset=utf-8",
        processData: false,
        method: "POST",
        success: function (response) {
            errorHandler(response, callBack, errorCallBack);
        },
        complete: function () {
            if (isEmpty(completeCallback)) {
                return;
            }
            completeCallback();
        }
    });
}

/* exported postToRestWithVersion */
function postToRestWithVersion(url, postData, callBack, errorCallBack) {
    postToRestWithVersionAndParams(url, postData, "", callBack, errorCallBack);
}

/* exported postToRestWithVersionAndParams */
function postToRestWithVersionAndParams(url, postData, params, callBack, errorCallBack) {
    getCurrentVersion(function (version) {
        $.ajax({
            url: url + "?versionId=" + version + params,
            cache: false,
            dataType: "json",
            data: postData,
            contentType: "application/json; charset=utf-8",
            processData: false,
            method: "POST",
            success: function (response) {
                errorHandler(response, callBack, errorCallBack);
            }
        });
    });
}

/* exported putToRestWithVersion */
function putToRestWithVersion(url, putData, callBack, errorCallBack) {
    putToRestWithVersionAndParams(url, putData, "", callBack, errorCallBack);
}

/* exported putToRestWithVersionAndParams */
function putToRestWithVersionAndParams(url, putData, params, callBack, errorCallBack) {
    getCurrentVersion(function (version) {
        $.ajax({
            url: url + "?versionId=" + version + params,
            cache: false,
            dataType: "json",
            data: putData,
            contentType: "application/json; charset=utf-8",
            processData: false,
            method: "PUT",
            success: function (response) {
                errorHandler(response, callBack, errorCallBack);
            }
        });
    });
}

/* exported deleteFromRest */
function deleteFromRest(url, callBack, completeCallback, errorCallBack) {
    $.ajax({
        url: url,
        cache: false,
        method: "DELETE",
        success: function (response) {
            errorHandler(response, callBack, errorCallBack);
        },
        complete: function () {
            if (isEmpty(completeCallback)) {
                return;
            }
            completeCallback();
        }
    });
}

/* exported getCurrentVersion */
function getCurrentVersion(callBack, errorCallBack) {
    var version = localStorage.getItem("currentVersion");

    if (($("#select-versions")[0].options.length > 0)
        && ($("#select-versions option[value='" + version + "']").length === 0)) {
        localStorage.removeItem("currentVersion");
        version = "";
    }

    if (isEmpty(version)) {
        getFromRest(urlVersions,
            function (versions) {
                if (isEmpty(versions) || versions.count === 0) {
                    return;
                }
                var currentVersion = versions.items[0];
                localStorage.setItem("currentVersion", currentVersion.id);
                callBack(currentVersion.id);
            },
            errorCallBack);
    } else {
        callBack(version);
    }
}

/* exported fillSelect */
function fillSelect(selectElement, values) {
    $(selectElement).html("");
    $.each(values, function (key, value) {
        $(selectElement).append(
            "<option value=\"" + value.id + "\">" + value.name + "</option>"
        );
    });
}

/* exported isUrlVarExists */
function isUrlVarExists(key) {
    var URL = window.location.href;
    if (URL.indexOf("?" + key + "=") !== -1) {
        return true;
    } else if (URL.indexOf("&" + key + "=") !== -1) {
        return true;
    } else if (URL.indexOf("?" + key + "&") !== -1) {
        return true;
    } else if (URL.indexOf("&" + key + "&") !== -1) {
        return true;
    } else if (URL.endsWith("?" + key)) {
        return true;
    } else if (URL.endsWith("&" + key)) {
        return true;
    }
    return false;
}

/* exported getUrlVar */
function getUrlVar(key) {
    var result = new RegExp(key + "=([^&]*)", "i").exec(window.location.search);
    return result && decodeURIComponent(result[1]) || "";
}
