<template>
    <!-- 计算公式 -->
    <div>{{formItem.value || listItem.placeholder}}</div>
</template>

<script>
export default {
    name: 'FormCalculate',
    props: {
        form: { type: Object, default: () => ({}) },
        listItem: { type: Object, default: () => ({}) },
        formItem: { type: Object, default: () => ({}) },
        subformUuid: { type: String, default: '' },
        valueIndex: { type: Number, default: -1 }
    },
    computed: {
        // 监听公式对象的变化同步计算
        value () {
            const getValue = item => item.mold === 'item' ? this.getValue(item.uuid) : item.title
            let right = true
            let value = 0
            if (this.listItem.formula.length && this.listItem.formula.every(getValue)) {
                const formula = this.listItem.formula.map(getValue).join('')
                // eslint-disable-next-line no-eval
                try { value = eval(formula) } catch (e) { right = false }
            } else {
                right = false
            }
            return right ? value.toFixed(2) - 0 + '' : ''
        }
    },
    watch: {
        // 同步 value
        value (value) {
            this.formItem.value = value
        }
    },
    methods: {
        // 获取公式对象的值
        getValue (uuid) {
            /* 规则
                1、公式对象在子表单外：无论计算公式在子表单外或内都是直接获取
                2、公式对象在子表单内：
                    如果计算公式和这个公式对象处于同一个子表单，则获取和这个公式对象处于同一位置的值
                    如果计算公式和这个公式对象不处于同一个子表单，则获取这个公式对象所有值的总和
            */
            let value = 0
            for (let index in this.form) {
                const item = this.form[index]
                // 公式对象在子表单外直接获取
                if (item.uuid === uuid) value = item.type === 'dateRange' ? item.result : item.value
                // 公式对象在子表单内
                if (item.type === 'subform') {
                    // 计算公式和这个公式对象处于同一个子表单获取同一位置的值
                    if (item.uuid === this.subformUuid) {
                        item.value.forEach((subItem, subIndex) => {
                            if (subIndex === this.valueIndex) {
                                for (let i in subItem) {
                                    const n = subItem[i]
                                    if (n.uuid === uuid) value = n.type === 'dateRange' ? n.result : n.value
                                }
                            }
                        })
                    } else {
                        // 不处于同一个子表单计算值的总和
                        item.value.forEach((subItem, subIndex) => {
                            for (let i in subItem) {
                                const n = subItem[i]
                                if (n.uuid === uuid) value += (n.type === 'dateRange' ? n.result : n.value) - 0
                            }
                        })
                    }
                }
            }
            return value
        }
    }
}
</script>

<style lang="less" scoped>
</style>
