<template>
  <!-- 对话框组件 -->
  <el-dialog
    v-model="visible"
  :title="!dataForm.id ? '新增' : '修改'"
  :close-on-click-modal="false"
  >
  <!-- 表单组件 -->
  <el-form
    ref="dataFormRef"
  :model="dataForm"
  :rules="dataRule"
  label-width="80px"
  @keyup.enter="onSubmit()"
  >
  <!-- 参数名输入项 -->
  <el-form-item
    label="参数名"
    prop="paramKey"
  >
  <el-input
    v-model="dataForm.paramKey"
  placeholder="参数名"
  />
  </el-form-item>
  <!-- 参数值输入项 -->
  <el-form-item
    label="参数值"
    prop="paramValue"
  >
  <el-input
    v-model="dataForm.paramValue"
  placeholder="参数值"
  />
  </el-form-item>
  <!-- 备注输入项 -->
  <el-form-item
    label="备注"
    prop="remark"
  >
  <el-input
    v-model="dataForm.remark"
  placeholder="备注"
  />
  </el-form-item>
  </el-form>

  <!-- 对话框底部操作按钮 -->
  <template #footer>
      <span class="dialog-footer">
        <el-button @click="visible = false">取消</el-button> <!-- 关闭对话框 -->
        <el-button type="primary" @click="onSubmit()">确定</el-button> <!-- 提交表单 -->
      </span>
  </template>
  </el-dialog>
</template>

<script setup>
import { ElMessage } from 'element-plus'
import { Debounce } from '@/utils/debounce'
import { ref, reactive, nextTick, defineEmits, defineExpose } from 'vue'

// 定义父组件事件
const emit = defineEmits(['refreshDataList'])

// 控制对话框显示状态的响应式变量
const visible = ref(false)

// 表单数据模型，使用reactive定义以保证其响应性
const dataForm = reactive({
  id: 0, // 配置项ID，0表示新增
  paramKey: '', // 参数名
  paramValue: '', // 参数值
  remark: '' // 备注
})

// 表单验证规则
const dataRule = {
  paramKey: [
    { required: true, message: '参数名不能为空', trigger: 'blur' }, // 必填验证
    { pattern: /\s\S+|S+\s|\S/, message: '请输入正确的参数名', trigger: 'blur' } // 正则表达式验证
  ],
  paramValue: [
    { required: true, message: '参数值不能为空', trigger: 'blur' }, // 必填验证
    { pattern: /\s\S+|S+\s|\S/, message: '请输入正确的参数值', trigger: 'blur' } // 正则表达式验证
  ]
}

// 获取表单实例引用
const dataFormRef = ref(null)

// 初始化方法，接收id作为参数
const init = (id) => {
  dataForm.id = id || 0 // 设置当前编辑的配置项ID
  visible.value = true // 打开对话框

  // 使用nextTick确保DOM更新完毕后执行
  nextTick(() => {
    dataFormRef.value?.resetFields() // 重置表单

    if (dataForm.id) {
      // 如果有id，则获取该配置项的详情
      http({
        url: http.adornUrl(`/sys/config/info/${dataForm.id}`),
        method: 'get',
        params: http.adornParams()
      }).then(({ data }) => {
        // 填充表单数据
        dataForm.paramKey = data.paramKey
        dataForm.paramValue = data.paramValue
        dataForm.remark = data.remark
      })
    }
  })
}

// 将init方法暴露给父组件调用
defineExpose({ init })

/**
 * 表单提交
 */
const onSubmit = Debounce(() => {
  // 验证表单
  dataFormRef.value?.validate((valid) => {
    if (valid) {
      // 发送HTTP请求保存配置信息
      http({
        url: http.adornUrl('/sys/config'),
        method: dataForm.id ? 'put' : 'post', // 判断是更新还是创建
        data: http.adornData({
          id: dataForm.id || undefined,
          paramKey: dataForm.paramKey,
          paramValue: dataForm.paramValue,
          remark: dataForm.remark
        })
      }).then(() => {
        // 成功提示
        ElMessage({
          message: '操作成功',
          type: 'success',
          duration: 1500,
          onClose: () => {
            visible.value = false // 关闭对话框
            emit('refreshDataList') // 触发刷新数据列表事件
          }
        })
      })
    }
  })
})
</script>
