import _ from "lodash";

/**
 * 校验公式 判断当前登录用户是否具有某(些)角色,以此支撑主表字段动态编辑属性
 * 公式说明 本公式适用于主表字段的可编辑配置,在接口回调内部处理了控件的读写状态
 * 调用实例 CheckRoleAuthentication("Input_1","RoleA","RoleB")
 * 校验规则 只有当登录用户的角色均包含在入参角色时 才返回true 即控件允许编辑
 * 规则说明
 *          用户角色[role1,role2]  入参为role1          返回true
 *          用户角色[role1,role2]  入参为role0          返回false
 *          用户角色[role1,role2]  入参为role1,role3    返回false
 *          用户角色[role1,role2]  入参为role1,role2    返回true
 *
 * @author fengjiansheng
 * @date 2021-09-15
 */
export default {
    execute:  function () {
        console.log("s1 CheckRoleAuthentication")
        if (arguments && arguments[0] && arguments[0].length > 1 && arguments[1]) {
            // TODO 入参校验
            let context = arguments[1]
            let controlName = arguments[0][0].StaticValue
            if(!_.isString(controlName)){
                GAMS.Common.messagePrompt("CheckRoleAuthentication:公式配置错误,第一个入参类型为控件名称,类型需为String")
                return false
            }
            this.getLoginUserRoleCodeInfo(nros.getUser().conetxtUser.id, resp => {
                console.log("s2 CheckRoleAuthentication api")
                let validLength = 0
                let validFlag = true
                for (let [index] of arguments[0].entries()) {
                    if (index === 0) {
                        continue
                    }
                    let tempField = arguments[0][index].StaticValue
                    if (resp.indexOf(tempField) > -1) {
                        validLength++
                    } else {
                        validFlag = false
                        break
                    }
                }
                context.setControlsSate(controlName, "editable", validFlag === false ? false : validLength === (arguments[0].length - 1))
                return validLength === arguments[0].length
            }, (resp) => {
                console.error("CheckRoleAuthentication:获取当前登录用户角色信息失败,resp:" + resp)
                context.setControlsSate(controlName, "editable", "false")
            })
        }
    },
    getResultType: () => FMR.ConstDataTypes.Bool,
    getLoginUserRoleCodeInfo: (userId, callback, errorCallback) => {
        nros.http.post('/nvwa-authority-role/v1/user/query', {
            "userId": userId
        }).then(res => {
            callback(res.data.data[0].roleCodes)
        }).catch(res => {
            errorCallback(res)
        })
    }
}
