import("Sql_lib");
import("system.db");
import("Attribute_lib");
import("system.vars");
import("system.result");
import("system.tools");
import("Util_lib");
import("Contact_lib");
import("JditoFilter_lib");
import("Employee_lib");

var users;
if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
    users = tools.getUsersByAttribute(tools.NAME, vars.get("$local.idvalues"), tools.PROFILE_FULL);
else
{
    var values = ["true", "false"];
    if (vars.exists("$param.OnlyActives_param") && vars.get("$param.OnlyActives_param") == "true")
        values = ["true"];
    users = tools.getUsersByAttribute(tools.ISACTIVE, values, tools.PROFILE_DEFAULT);
}

users = users.map(function (user)
{
    return [
        user[tools.NAME],
        user[tools.TITLE],
        user[tools.PARAMS][tools.ISACTIVE],
        user[tools.PARAMS][tools.FIRSTNAME],
        user[tools.PARAMS][tools.LASTNAME],
        user[tools.PARAMS][tools.EMAIL],
        user[tools.PARAMS][tools.EMAIL],
        user[tools.DESCRIPTION],
        user[tools.PARAMS][tools.CONTACTID], //8
        user[tools.PARAMS].department,
        "", //password
        "", //confirm_password
        user[tools.ROLENAMES], //for filtering
        EmployeeUtils.sliceUserId(user[tools.NAME]),
        user[tools.PARAMS][tools.PHONE_ADDRESS]
    ];
});

var filter = vars.get("$local.filter"); 

//TODO: this is a workaround that filters the records manually, it should be possible to filter the users with a tools.* method
var filterFields = ["UID", "TITLE", "ISACTIVE", "FIRSTNAME", "LASTNAME", "EMAIL_ADDRESS", "", "DESCRIPTION", "CONTACT_ID", "DEPARTMENT", "", "", "ROLE_FILTER", "$$$LOOKUPFIELD$$$"];
var filterFns = {
    "ROLE_FILTER" : function (pRecordVal, pFilterVal, pOperator)
    {
        if (!pRecordVal)
            pRecordVal = [];
        switch (pOperator)
        {
            case "EQUAL":
                return pRecordVal.indexOf(pFilterVal) !== -1;
            case "NOT_EQUAL":
                return pRecordVal.indexOf(pFilterVal) === -1;
            case "ISNULL":
                return pRecordVal.length === 0;
            case "ISNOTNULL":
                return pRecordVal.length !== 0;
            default:
                return false;
        }
    },
    "$$$LOOKUPFIELD$$$" : function (pRecordValue, pFilterValue, pOperator, pRow)
    {
        if (pOperator == "CONTAINS")
        {
            pRow = [pRow[1], pRow[3], pRow[4], pRow[5]];
            var filterValues = pFilterValue.split(" ").filter(function (val) {return val.trim();});
            return filterValues.every(function (filterValue)
            {
                return pRow.some(function (fieldValue)
                {
                    return (new RegExp(filterValue, "i")).test(fieldValue);
                });
            });
        }
        return false;
    }
};
users = JditoFilterUtils.filterRecords(filterFields, users, filter.filter, filterFns);

var order = vars.get("$local.order");
var columnOrder = {
    "TITLE.value" : 1,
    "ISACTIVE.value" : 2,
    "FIRSTNAME.value" : 3,
    "LASTNAME.value" : 4
};
var sortOrder = [];
for (let field in order)
{
    if (field in columnOrder)
    {
        sortOrder.push(columnOrder[field]);
        sortOrder.push(order[field] == "DOWN");
    }
}
if (!sortOrder.length) //sort by login by default
    sortOrder = [1, false];

ArrayUtils.sortMulti(users, sortOrder);

result.object(users);