// 定义 FormProperty 函数
const FormProperty = (propertyId, formSchema, required = []) => {
    // 初始化私有属性
    const _propertyId = propertyId;
    const _formSchem = formSchema;
    const _required = required;

    // 定义 formSchema 的 getter 方法
    const getFormSchema = () => {
        return _formSchem || {};
    };

    // 定义 key 的 getter 方法
    const getKey = () => {
        return _propertyId;
    };

    // 定义 type 的 getter 方法
    const getType = () => {
        return getFormSchema().view;
    };

    // 定义 disabled 的 getter 方法
    const getDisabled = () => {
        if (_formSchem && _formSchem.ui && _formSchem.ui.widgetattrs && _formSchem.ui.widgetattrs.disabled === true) {
            return true;
        }
        return false;
    };

    // 定义 label 的 getter 方法
    const getLabel = () => {
        const schema = getFormSchema();
        return schema.title || getKey();
    };

    // 定义 placeholder 的 getter 方法
    const getPlaceholder = () => {
        const viewType = getType();
        const label = getLabel();
        if (viewType.indexOf('date') >= 0 || viewType.indexOf('select') >= 0 || viewType.indexOf('list') >= 0) {
            return "请选择" + label;
        } else if (viewType.indexOf('upload') >= 0 || viewType.indexOf('file') >= 0 || viewType.indexOf('image') >= 0) {
            return "请上传" + label;
        } else {
            return "请输入" + label;
        }
    };

    // 定义 dictStr 的 getter 方法
    const getDictStr = () => {
        const viewType = getType();
        if (viewType === 'sel_search') {
            const schema = getFormSchema();
            return schema.dictTable + ',' + schema.dictText + ',' + schema.dictCode;
        }
        return '';
    };

    // 定义 listSource 的 getter 方法
    const getListSource = () => {
        const schema = getFormSchema();
        if (!schema.enum) {
            return [];
        }
        const arr = [...schema.enum];
        for (let a = 0; a < arr.length; a++) {
            if (!arr[a].label) {
                arr[a].label = arr[a].text;
            }
            if (schema.type === 'number') {
                arr[a].value = parseInt(arr[a].value);
            }
        }
        return arr;
    };

    // 定义 popupCode 的 getter 方法
    const getPopupCode = () => {
        return getFormSchema().code;
    };

    // 定义 dest 的 getter 方法
    const getDest = () => {
        return getFormSchema().destFields;
    };

    // 定义 ogn 的 getter 方法
    const getOgn = () => {
        return getFormSchema().orgFields;
    };

    // 定义 rules 的 getter 方法
    const getRules = () => {
        const rules = [];
        const isRequired = _required?.includes(getKey()) ?? false;
        if (isRequired) {
            let msg = getLabel() + '为必填项';
            rules.push({ required: true, message: msg });
        }
        let viewType = getType();
        if ('list' === viewType || 'markdown' === viewType || 'pca' === viewType) {
            return rules;
        }
        if (viewType.indexOf('upload') >= 0 || viewType.indexOf('file') >= 0 || viewType.indexOf('image') >= 0) {
            return rules;
        }

        const schema = getFormSchema();
        if (schema.pattern) {
            if (schema.pattern === 'only') {
                // 这里 checkOnlyMethod 未定义,需要根据实际情况补充
                rules.push({ validator: () => {} });
            } else if (schema.pattern === 'z') {
                if (schema.type === 'number' || schema.type === 'integer') {
                    // 这里 onlyInteger 未定义,需要根据实际情况处理
                } else {
                    rules.push({ pattern: '^-?[1-9]\\d*$', message: '请输入整数' });
                }
            } else {
                let msg = getLabel() + '校验未通过';
                rules.push({ pattern: schema.pattern, message: msg });
            }
        }
        return rules;
    };

    // 返回包含所有 getter 方法的对象
    return {
        get formSchema() {
            return getFormSchema();
        },
        get key() {
            return getKey();
        },
        get type() {
            return getType();
        },
        get disabled() {
            return getDisabled();
        },
        get label() {
            return getLabel();
        },
        get placeholder() {
            return getPlaceholder();
        },
        get dictStr() {
            return getDictStr();
        },
        get listSource() {
            return getListSource();
        },
        get popupCode() {
            return getPopupCode();
        },
        get dest() {
            return getDest();
        },
        get ogn() {
            return getOgn();
        },
        get rules() {
            return getRules();
        }
    };
};

export default FormProperty;