var contractStructure_INTERFACE = function() {
    var DATA, ACTION;
    var responseData;
    var TOKEN;
    var USER_ID;

    const URL_REST_INTERFACE = "/catalogPortlet.web/rest/private/";
    const URL_CONTRACT_STRUCTURE_REST_INTERFACE = URL_REST_INTERFACE + "contractStructureRestService/";
    const URL_CONTRACT_STRUCTURE_INIT = URL_CONTRACT_STRUCTURE_REST_INTERFACE + "init/";
    const URL_CONTRACT_STRUCTURE_CONTRACT = URL_CONTRACT_STRUCTURE_REST_INTERFACE + "contract/";
    const URL_CONTRACT_STRUCTURE_SAVE_ANSWER = URL_CONTRACT_STRUCTURE_REST_INTERFACE + "saveAnswer/";
    const URL_CONTRACT_STRUCTURE_ANSWERS_HISTORY = URL_CONTRACT_STRUCTURE_REST_INTERFACE + "answersHistory/";

    return {
        "loadTender":loadTender,
        "loadContract":loadContract,
        "saveAnswer":saveAnswer,
        "loadAnswersHistory":loadAnswersHistory,
        "init":init,
        "clearData":clearData,
        "clearDataContractBase":clearDataContractBase
    };

    function loadTender() {
        var jsonRequest = {"token": TOKEN, "tenderId": DATA.filter.tenderId};
        var tenderBase = loadJson(URL_CONTRACT_STRUCTURE_INIT, jsonRequest);
        if (tenderBase) {
            DATA.tenderBase = tenderBase;
            return true;
        }
    }

    function loadContract() {
        var jsonRequest = {"token": TOKEN, "tenderId": DATA.filter.tenderId, "organizationId": DATA.filter.organizationId};
        var contractBase = loadJson(URL_CONTRACT_STRUCTURE_CONTRACT, jsonRequest);
        if (contractBase) {
            DATA.contractBase = contractBase;
            return true;
        }
    }

    function saveAnswer(answerId, organizationId, processStepFormId, questionId, tenderId, value)  {
        var jsonRequest = {"token": TOKEN, "userId": USER_ID, "value": value, "answerId": answerId,
                           "organizationId": organizationId, "processStepFormId": processStepFormId, "questionId": questionId,
                           "tenderId": tenderId
                          };
        var success = loadJson(URL_CONTRACT_STRUCTURE_SAVE_ANSWER, jsonRequest);
        return success;
    }

    function loadAnswersHistory(organizationId, processStepFormId, questionId, rowIndex)  {
        var jsonRequest = {"token": TOKEN,
                           "organizationId": organizationId, "processStepFormId": processStepFormId, "questionId": questionId, "rowIndex": rowIndex};
        var answerHistoryData = loadJson(URL_CONTRACT_STRUCTURE_ANSWERS_HISTORY, jsonRequest);
        return answerHistoryData;
    }

    function loadJson(jsonUrl, jsonRequest)  {
        responseData = {};
        DATA.messages = {};

        var success = ajaxPut(jsonUrl, jsonRequest);
        if (success) {
            if (responseData) {
                return responseData;
            } else {
                success = false;
                showMessages();
            }
        }
        return success;
    }

    function showMessages() {
        var htm = "";
        if (DATA.messages && DATA.messages.length > 0) {
            htm += DATA.messages[0].type + ": " + DATA.messages[0].text;
        }
    }

    function ajaxPut(restURL, requestJson) {
        var isOk = true;
        var ajaxOptions = getAjaxPutOptions(restURL, requestJson);
        var ajaxCall = util.ajax.blocked2(ajaxOptions);
        ajaxCall.done(function(responseJson) {
            try {
                if (responseJson) {
                    TOKEN = responseJson.token;
                    DATA.messages = responseJson.messages;
                    responseData = responseJson.responseData;
                }
            } catch (e) {
                util.log.error("Putting HTTP request failed: " + e);
                isOk = false;
            }
        });
        return isOk;
    }

    function getAjaxPutOptions(restURL, requestJson) {
        var ajaxOptions = {
            data: JSON.stringify(requestJson),
            url: restURL
        };
        return ajaxOptions;
    }

    function init(contractStructure, token, userId) {
        ACTION = contractStructure.ACTION;
        DATA = contractStructure.DATA;
        TOKEN = token;
        USER_ID = userId;
    }

    function clearDataContractBase() {
        delete DATA["contractBase"];
    }

    function clearData() {
        for (var elem in DATA) {
            if (elem !== "guiParentSelector" && elem !== "filter" ) {
                delete DATA[elem];
            }
        }
    }

}
