<template>
  <Modal
    :options="getModalOptions"
    :on-positive-click="handleConfirm"
    :on-negative-click="handleClose"
    :on-close="handleClose"
  >
    <template #Context>
      <n-form
        ref="formRef"
        :model="userForm"
        :rules="userRules"
        :label-width="80"
        label-placement="left"
        require-mark-placement="left"
        :disabled="disabled"
      >
        <template v-for="(item,index) in getFormOptions" :key="index">
          <n-form-item :label="item.label" :path="item.key">
            <n-input v-if="item.type === 'input'" v-model:value="userForm[item.key]" :disabled="item.key==='username' && modelTyle ==='update'" v-bind="item.props" />
            <n-select v-if="item.type === 'select'" v-model:value="userForm[item.key]" v-bind="item.props" />
          </n-form-item>
        </template>
      </n-form>
    </template>
  </Modal>
</template>

<script>
import { form, getRoleOptions } from '../tools/form.js'
import { defineComponent, ref, reactive, computed, toRefs } from 'vue'
import { userCreate, userUpdate } from '@/api/system/user.js'
import Modal from '@/components/Modal/index.vue'
export default defineComponent({
  name: 'UserModal',
  components: { Modal },
  props: {
    visible: {
      type: Boolean,
      default: false
    },
    type: {
      type: String,
      default: 'create'
    },
    data: {
      type: Object,
      default: () => {}
    }
  },
  emits: {
    'update:visible': null,
    'reload': null
  },
  setup(props, { emit }) {
    const MODAL_TYPE = {
      'create': '新建人员信息',
      'preview': '人员详情',
      'update': '编辑人员信息'
    }
    getRoleOptions()
    const { userForm, userRules } = form
    const formRef = ref()
    const data = reactive({
      userForm: {
        ...userForm,
        ...props.data
      },
      userRules: {
        ...userRules
      },
      modelTyle: props.type,
      disabled: props.type === 'preview'
    })

    const getModalOptions = computed(() => {
      return {
        title: MODAL_TYPE[props.type],
        show: props.visible,
        negativeText: '取消',
        positiveText: '确认'
      }
    })

    const getFormOptions = computed(() => {
      const formOptions = [
        ...form.formItem
      ]
      if (props.type !== 'create') {
        formOptions.splice(4, 1)
      }
      return formOptions
    })

    function handleConfirm() {
      formRef.value?.validate((errors) => {
        if (!errors) {
          const params = { ...data.userForm }
          if (params.id) {
            /* 编辑 */
            delete params['password']
            userUpdate(params)
              .then(res => {
                if (res.code === 0) {
                  emit('reload')
                  handleClose()
                }
              })
          } else {
            /* 新增 */
            userCreate(params)
              .then(res => {
                if (res.code === 0) {
                  emit('reload')
                  handleClose()
                }
              })
          }
        } else {
          $message.error('请完善必填信息')
        }
      })
    }

    /* 关闭弹窗 */
    const handleClose = () => {
      emit('update:visible', false)
    }

    return {
      ...toRefs(data),
      formRef,
      getModalOptions,
      getFormOptions,
      handleConfirm,
      handleClose
    }
  }
})
</script>
<style scoped lang='scss'>
</style>
