var quickFS_CONTRACT_STATUS = function() {
    var DATA;

    const CONTRACT_STATUS_0 = "NOT_INTERESTED";
    const CONTRACT_STATUS_1 = "OPEN";
    const CONTRACT_STATUS_2 = "IN_PROCESS";
    const CONTRACT_STATUS_3 = "RELEASED";
    const CONTRACT_STATUS_4 = "ACCEPTED_CONTRACT";
    const CONTRACT_STATUS_5 = "REJECTED";
    const CONTRACT_STATUS_6 = "NEGOTIATION";
    const CONTRACT_STATUS_7 = "IN_NEGOTIATION";
    const CONTRACT_STATUS_8 = "RELEASED_NEGOTIATION";
    const CONTRACT_STATUS_9 = "REJECTED_NEGOTIATION";
    const CONTRACT_STATUS_10 = "IMPORTED_WITH_ERRORS";
    const CONTRACT_STATUS_11 = "FIRST_ACCEPTED";
    const CONTRACT_STATUS_12 = "SECOND_ACCEPTED";
    const CONTRACT_STATUS_13 = "FIRST_REJECTED";
    const CONTRACT_STATUS_14 = "SECOND_REJECTED";
    const CONTRACT_STATUS_15 = "NO_AGREEMENT";
    const CONTRACT_STATUS_16 = "COUNTER_OFFER";

    const PERMISSION_TYPE_0 = "PROJECT_MANAGER";
    const PERMISSION_TYPE_1 = "BUYER";
    const PERMISSION_TYPE_2 = "BUYER_ASSISTANT";
    const PERMISSION_TYPE_3 = "BUYER_READ_ONLY";
    const PERMISSION_TYPE_4 = "CHIEF_TRAVEL_MANAGER_OPERATIVE";
    const PERMISSION_TYPE_5 = "CHIEF_TRAVEL_MANAGER_PLACING";
    const PERMISSION_TYPE_6 = "TRAVEL_MANAGER_OPERATIVE";
    const PERMISSION_TYPE_7 = "TRAVEL_MANAGER_PLACING";
    const PERMISSION_TYPE_8 = "TRAVEL_MANAGER_READ_ONLY";
    const PERMISSION_TYPE_9 = "REPRESESANTIVE_PARENT_ORGANIZATION";
    const PERMISSION_TYPE_10 = "SUPPLIER";
    const PERMISSION_TYPE_11 = "SUPPLIER_ASSISTANT";
    const PERMISSION_TYPE_12 = "SUPPLIER_READ_ONLY";
    const PERMISSION_TYPE_13 = "NaN";

    return {
        "init":init,
        "render":render
    };

    // --------------------------------------------------------------------------------------------------
    // --------------------------------------------  public  --------------------------------------------
    // --------------------------------------------------------------------------------------------------

    // ---------------------- init object ----------------------

    function init(quickFS) {
        DATA = quickFS.DATA;
    }

    // ---------------------- render stuff ----------------------

    function render(tenderId, organizationId) {
        var actionMap = [];

        var tenderData = DATA.definitionBase.tenderMap[tenderId][0];
        var organization = DATA.pageBase.tenderOrganizationMap.get(organizationId);
        var projectRole = getProjectRole(tenderData);
        if (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole)) {                 // contract_status_actions.xhtml rendered="#{placingMappingRenderProvider.buyerOpenOrNoDualCoreRestrictions(mapping)}"
            actionMap["rollback"] = rollback(tenderData, organization, projectRole);
            actionMap["changeToConfirmed"] = changeToConfirmed(tenderData, organization, projectRole);
            actionMap["negotiation"] = negotiation(tenderData, organization, projectRole);
            actionMap["negotiationDualControl"] = negotiationDualControl(tenderData, organization, projectRole);
            actionMap["notInterested"] = notInterested(tenderData, organization, projectRole);
            actionMap["accept"] = acceptReject(tenderData, organization, projectRole);
            actionMap["reject"] = acceptReject(tenderData, organization, projectRole);
            actionMap["firstDecisionAccepted"] = firstDecision(tenderData, organization, projectRole);
            actionMap["firstDecisionRejected"] = firstDecision(tenderData, organization, projectRole);
            actionMap["secondDecisionAcceptedAccept"] = secondDecisionAccepted(tenderData, organization, projectRole);
            actionMap["secondDecisionAcceptedReject"] = secondDecisionAccepted(tenderData, organization, projectRole);
            actionMap["secondDecisionRejectedAccept"] = secondDecisionRejected(tenderData, organization, projectRole);
            actionMap["secondDecisionRejectedReject"] = secondDecisionRejected(tenderData, organization, projectRole);
            actionMap["undoFirstDecision"] = undoFirstDecision(tenderData, organization, projectRole);
            actionMap["undoSecondDecision"] = undoSecondDecision(tenderData, organization, projectRole);
        }
        return actionMap;
    }

    // ---------------------- user stuff ----------------------

    // ---------------------- page stuff ----------------------

    // ---------------------------------------------------------------------------------------------------
    // --------------------------------------------  private  --------------------------------------------
    // ---------------------------------------------------------------------------------------------------

    // ---------------------- action stuff ----------------------

    function rollback(tenderData, organization, projectRole) {
        var render = false;

        if (organization.contract_status == 0) {
            render = true;
        } else if (tenderData.dualControl == "1") {
            if ((organization.contract_status == 4 || organization.contract_status == 5)  &&
                hasUserSecondAcceptanceRole() &&                                                                            // user.isSecondAcceptance()
                isAllowedBuyer(projectRole)
               ) {
                render = true;
            } else if ((organization.contract_status == 6) && (isAllowedBuyer(projectRole))) {
                render = true;
            }
        } else if ((organization.contract_status == 0 || organization.contract_status == 4 ||
                    organization.contract_status == 5 || organization.contract_status == 6) &&
                   isAllowedBuyer(projectRole)
                  ) {
            render = true;
        }

        return render;
    }

    function changeToConfirmed(tenderData, organization, projectRole) {
        var render = false;

        if (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole)) {
            if (isChangeToConfirm(projectRole) && hasUserSecondAcceptanceRole()) {                                           // user.isSecondAcceptance()
                render = (organization.contract_status != 0) && (organization.contract_status != 1) &&
                         (organization.contract_status != 2) && (organization.contract_status != 3);
                if (tenderData.dualControl == "1") {
                    var dual = (organization.contract_status == 3) &&
                                ((organization.dual_control_contract_status == 11) ||
                                 (organization.dual_control_contract_status == 13) ||
                                 (organization.dual_control_contract_status == 15)
                                );
                    render = render || dual;
                }
            }
        }

        return render;
    }

    function negotiation(tenderData, organization, projectRole) {
        var render = false;

        if (tenderData.dualControl != "1" &&
            (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole))) {
            render = isSecondAction(projectRole) &&                                                                     // true anyway, because of isGroupsWithoutDualCoreRestrictions
                     organization.modifyOfferStatus != "1" &&
                     (organization.contract_status == 3 || organization.contract_status == 8 ||
                      organization.contract_status == 9 || organization.contract_status == 16);
        }

        return render;
    }

    function negotiationDualControl(tenderData, organization, projectRole) {
        var render = false;

        if (tenderData.dualControl == "1" &&
            (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole))) {
            render = isSecondAction(projectRole) &&                                                                     // true anyway, because of isGroupsWithoutDualCoreRestrictions
                     organization.modifyOfferStatus != "1" &&
                     (organization.contract_status == 3 || organization.contract_status == 8 ||
                      organization.contract_status == 9 || organization.contract_status == 16);
            render = render && !organization.dual_control_first_user_id;
        }

        return render;
    }

    function notInterested(tenderData, organization, projectRole) {
        var render = organization.contract_status == 1 || organization.contract_status == 2;

        return render;
    }

    function acceptReject(tenderData, organization, projectRole) {
        var render = false;

        if (tenderData.dualControl != "1" &&
            (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole))) {
            render = isFirstAcceptOrReject(projectRole) &&                                                              // true anyway, because of isGroupsWithoutDualCoreRestrictions
                     organization.modifyOfferStatus != "1" &&
                     (organization.contract_status == 3 || organization.contract_status == 8 ||
                      organization.contract_status == 9 || organization.contract_status == 16);
        }

        return render;
    }

    function firstDecision(tenderData, organization, projectRole) {
        var render = false;

        if (tenderData.dualControl == "1" &&
            (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole))) {
            render = isFirstAcceptOrReject(projectRole) &&                                                              // true anyway, because of isGroupsWithoutDualCoreRestrictions
                     organization.modifyOfferStatus != "1" &&
                     (organization.contract_status == 3 || organization.contract_status == 8 ||
                      organization.contract_status == 9 || organization.contract_status == 16);
            render = render && !organization.dual_control_first_user_id &&
                               !organization.dual_control_first_manager_status;
        }

        return render;
    }

    function secondDecisionAccepted(tenderData, organization, projectRole) {
        var render = false;

        var secondAcceptReject = isSecondAcceptReject(projectRole);

        if (tenderData.dualControl == "1" &&
            (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole))) {
            if (secondAcceptReject && organization.modifyOfferStatus != 1) {
                render = organization.contract_status == 3 || organization.contract_status == 8 ||
                         organization.contract_status == 9 || organization.contract_status == 16;
                if (render) {
                    render = render && organization.dual_control_first_user_id != DATA.userId &&
                             organization.dual_control_first_manager_status == 11 &&
                             !organization.dual_control_second_user_id &&
                             !organization.dual_control_second_manager_status;
                }
            }
        }

        return render;
    }

    function secondDecisionRejected(tenderData, organization, projectRole) {
        var render = false;

        var secondAcceptReject = isSecondAcceptReject(projectRole);

        if (tenderData.dualControl == "1" &&
            (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole))) {
            if (secondAcceptReject && organization.modifyOfferStatus != 1) {
                render = organization.contract_status == 3 || organization.contract_status == 8 ||
                         organization.contract_status == 9 || organization.contract_status == 16;
                if (render) {
                    render = render && organization.dual_control_first_user_id != DATA.userId &&
                             organization.dual_control_first_manager_status == 13 &&
                             !organization.dual_control_second_user_id &&
                             !organization.dual_control_second_manager_status;
                }
            }
        }

        return render;
    }

    function undoFirstDecision(tenderData, organization, projectRole) {
        var render = false;

        if (tenderData.dualControl == "1" &&
            (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole))) {
            if (isFirstAcceptOrReject(projectRole) &&
                organization.dual_control_first_user_id &&
                organization.modifyOfferStatus != 1) {
                render = organization.contract_status == 3 || organization.contract_status == 8 ||
                         organization.contract_status == 9 || organization.contract_status == 16;
                if (render) {
                    var v1 = organization.dual_control_undo_decision == "1" &&
                             organization.dual_control_first_manager_status == organization.dual_control_contract_status;
                    var v2 = organization.dual_control_undo_decision != "1" &&
                             !organization.dual_control_second_manager_status &&
                             !organization.dual_control_second_user_id &&
                             (organization.dual_control_first_user_id == DATA.userId || isProjectManagerOrBuyer(projectRole));
                    render = v1 || v2;
                }
            }
        }

        return render;
    }

    function undoSecondDecision(tenderData, organization, projectRole) {
        var render = false;

        var secondAcceptReject = isSecondAcceptReject(projectRole);

        if (tenderData.dualControl == "1" &&
            (organization.closeStatusBuyer == "0" || isGroupsWithoutDualCoreRestrictions(projectRole))) {
            if (secondAcceptReject &&
                !organization.dual_control_first_user_id &&
                !organization.dual_control_second_user_id &&
                organization.modifyOfferStatus != 1) {
                render = organization.contract_status == 3 || organization.contract_status == 8 ||
                         organization.contract_status == 9 || organization.contract_status == 16;
                if (render) {
                    render = organization.dual_control_undo_decision != "1" &&
                             (organization.dual_control_second_user_id == DATA.userId || isProjectManagerOrBuyer(projectRole)) &&
                             organization.dual_control_contract_status == 15;
                }
            }
        }

        return render;
    }

    // ---------------------- permission stuff ----------------------

    function hasUserSecondAcceptanceRole() {
        return DATA.userRoleMap.hasOwnProperty("2nd Acceptance") || DATA.userRoleMap.hasOwnProperty("Administrator");
    }

    function isMilestoneDisabled(tenderColumnData) {
        return (tenderColumnData.tmsRestrictive == "1") && Date.parse(tenderColumnData.tmsEndDate) <= new Date();
    }

    function isChangeToConfirm(projectRole) {
        return projectRole == PERMISSION_TYPE_0 || projectRole == PERMISSION_TYPE_1;
    }

    function isProjectManagerOrBuyer(projectRole) {
        return projectRole == PERMISSION_TYPE_0 || projectRole == PERMISSION_TYPE_1 || projectRole == PERMISSION_TYPE_2;
    }

    function isGroupsWithoutDualCoreRestrictions(projectRole) {
        return projectRole == PERMISSION_TYPE_0 || projectRole == PERMISSION_TYPE_1 ||
               projectRole == PERMISSION_TYPE_4 || projectRole == PERMISSION_TYPE_5;
    }

    function isAllowedBuyer(projectRole) {
        return isGroupsWithoutDualCoreRestrictions(projectRole) || projectRole ==  PERMISSION_TYPE_6 || projectRole == PERMISSION_TYPE_7;
    }

    function isFirstAcceptOrReject(projectRole) {
        return projectRole ==  PERMISSION_TYPE_0 || projectRole == PERMISSION_TYPE_1 || projectRole == PERMISSION_TYPE_2 ||
               projectRole ==  PERMISSION_TYPE_4 || projectRole == PERMISSION_TYPE_5 || projectRole == PERMISSION_TYPE_6 || projectRole == PERMISSION_TYPE_7;
    }

    function isSecondAction(projectRole) {
        return projectRole ==  PERMISSION_TYPE_0 || projectRole == PERMISSION_TYPE_1 || projectRole == PERMISSION_TYPE_2 ||
               projectRole ==  PERMISSION_TYPE_4 || projectRole == PERMISSION_TYPE_5 || projectRole == PERMISSION_TYPE_6 || projectRole == PERMISSION_TYPE_7;
    }

    function isSecondAcceptReject(projectRole) {
        var secondAcceptReject = false;
        if (hasUserSecondAcceptanceRole()) {
            if (isProjectManagerOrBuyer(projectRole)) {
                secondAcceptReject = true;
            }
        }
        return secondAcceptReject;
    }

    function getProjectRole(tenderData) {
        var projectRole = PERMISSION_TYPE_13;
        if (tenderData.leadingBusinessUnitId) {
            if (tenderData.tender_project_id <= 0) {
                projectRole = PERMISSION_TYPE_0;
            } else {
                for (var userRoleName in DATA.userRoleMap) {
                    var userRole = DATA.userRoleMap[userRoleName];
                    var pr;
                    switch (userRole.ugType) {
                    case "0":      // BUYER
                        pr = eval("PERMISSION_TYPE_" + userRole.ugBuyerStatus);
                        break;
                    case "1":      // TRAVEL_MANAGER
                        pr = eval("PERMISSION_TYPE_" + userRole.ugTravelManagerStatus);
                        break;
                    case "2":      // SERVICE_PROVIDER
                        pr = eval("PERMISSION_TYPE_" + userRole.ugServiceProviderStatus);
                        break;
                    }
                    if (pr) {
                        projectRole = pr;
                        break;
                    }
                }
            }
        }
        return projectRole;
    }

}
