<template>
    <abstract-dialog :loading="loading" :title="title" :value="value" @close="cancel" @open="open">
        <abstract-form :model="form" :rules="rules">
            <el-form-item label="编 码" prop="id">
                <el-input v-model="form.id" :readonly="!canEdit" maxlength="20"/>
            </el-form-item>
            <el-form-item label="名 称" prop="name">
                <el-input v-model="form.name" :readonly="!canEdit" maxlength="20"/>
            </el-form-item>
            <el-form-item label="级 别" prop="level">
                <el-select v-model="form.level" clearable @clear="form.level=null">
                  <el-option :value="1" label="一级"/>
                  <el-option :value="2" label="二级"/>
                </el-select>
            </el-form-item>
            <el-form-item label="类 型" prop="type">
              <el-select v-model="form.type" clearable @clear="form.type=null">
                <el-option :value="1" label="常温"/>
                <el-option :value="2" label="冷藏"/>
              </el-select>
            </el-form-item>
            <el-form-item label="状 态" prop="enable">
                <el-radio-group v-model="form.enable" :disabled="!canEdit">
                    <el-radio :label="true">启用</el-radio>
                    <el-radio :label="false">禁用</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="备 注" prop="remark">
                <el-input
                    v-model="form.remark"
                    :rows="4"
                    :readonly="!canEdit"
                    maxlength="200"
                    show-word-limit
                    type="textarea"
                />
            </el-form-item>
        </abstract-form>

        <template v-slot:footer>
            <el-button plain size="small" @click="closeDialog">取 消</el-button>
            <el-button v-if="canEdit" size="small" type="primary" @click="confirm">确 定</el-button>
        </template>
    </abstract-dialog>
</template>

<script>
import dialogMixin from "@/mixin/dialogMixin"
import AbstractForm from "@/component/abstract/Form"
import AbstractDialog from '@/component/abstract/Dialog'
import {add, update} from "@/api/system/storehouse"
import {isEmpty, mergeObj, resetObj} from '@/util'
import {elConfirm} from "@/util/message"

export default {
    name: "EditDialog",

    mixins: [dialogMixin],

    components: {AbstractForm, AbstractDialog},

    props: {
        value: Boolean,
        type: {type: String, default: 'see'},
        data: {
            type: Object,
            default: () => ({})
        },
    },

    data() {
        return {
            loading: false,
            form: {
                id: null,
                name: null,
                level: null,
                type: null,
                enable: false,
                remark: null
            },
            rules: {
                id: [{required: true, message: '编号不能为空', trigger: 'change'}],
                level: [{required: true, message: '级别不能为空', trigger: 'change'}],
                type: [{required: true, message: '类型不能为空', trigger: 'change'}],
            }
        }
    },

    computed: {
        title() {
            if (isEmpty(this.type)) return ''
            switch (this.type) {
                case 'see':
                    return '仓库信息'
                case 'add':
                    return '添加仓库'
                case 'edit':
                    return '编辑仓库'
            }
        },

        confirmMessage() {
            switch (this.type) {
                case 'add':
                    return `确认添加新的仓库【${this.form.name}】?`
                case 'edit':
                    return `确认提交对【${this.data.name}】作出的修改？`
                default:
                    return ''
            }
        },

        canEdit() {
            return ['add', 'edit'].includes(this.type)
        }
    },

    methods: {

        open() {
            if (this.type !== 'add') mergeObj(this.form, this.data)
        },

        clearForm() {
            resetObj(this.form)
            this.$nextTick(() => this.$refs.form.clearValidate())
        },

        cancel() {
            this.closeDialog()
            this.clearForm()
        },

        confirm() {
            if (this.loading) return
            this.$refs.form.validate(v => {
                if (!v) return
              elConfirm(this.confirmMessage)
                    .then(() => {
                      this.loading = true
                        return this.type === 'add' ? add.request(this.form) : update.request(this.form)
                    })
                    .then(({msg}) => {
                      this.$emit('success', msg)
                    })
                    .finally(() => {
                      this.loading = false
                    })
            })
        }
    }
}
</script>
