<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="title"
        :rules="[
          { required: true, message: '标签名称不能为空', trigger: 'blur' },
          { pattern: /\s\S+|\S\s|\S/, message: '请输入正确的标签名称', trigger: 'blur' }
        ]"
      >
        <el-input v-model="dataForm.title" />
      </el-form-item>

      <!-- 状态选择 -->
      <el-form-item label="状态" prop="status">
        <el-radio-group v-model="dataForm.status">
          <el-radio :label="1">正常</el-radio>
          <el-radio :label="0">禁用</el-radio>
        </el-radio-group>
      </el-form-item>

      <!-- 列表样式选择 -->
      <el-form-item label="列表样式" prop="style">
        <el-radio-group v-model="dataForm.style">
          <el-radio :label="0">一列一个</el-radio>
          <el-radio :label="1">一列两个</el-radio>
          <el-radio :label="2">一列三个</el-radio>
        </el-radio-group>
      </el-form-item>

      <!-- 排序 -->
      <el-form-item label="排序" prop="seq">
        <el-input-number
          v-model="dataForm.seq"
          controls-position="right"
          :min="0"
          label="排序号"
        />
      </el-form-item>
    </el-form>

    <!-- 对话框底部按钮 -->
    <template #footer>
      <div class="dialog-footer">
        <el-button @click="visible = false">取消</el-button>
        <el-button type="primary" @click="onSubmit()">确定</el-button>
      </div>
    </template>
  </el-dialog>
</template>

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

// 定义事件发射器，用于向父组件发送事件
const emit = defineEmits(['refreshDataList'])

// 控制对话框显示/隐藏的布尔值
const visible = ref(false)

// 表单验证规则对象（此处未定义具体规则）
const dataRule = {}

// 数据表单对象，初始化默认值
const dataForm = ref({
  id: null,
  title: null,
  shopId: null,
  status: 1, // 默认为正常状态
  isDefault: null,
  prodCount: null,
  seq: 0, // 默认排序值为0
  style: 0 // 默认列表样式为一列一个
})

// 初始化方法，接受可选的产品标签ID作为参数
const init = (id) => {
  dataForm.value.id = id || 0
  visible.value = true
  nextTick(() => {
    // 如果存在引用，则重置表单字段
    dataFormRef.value?.resetFields()
    if (dataForm.value.id) {
      // 如果有ID，说明是编辑模式，获取对应的数据并填充到表单中
      http({
        url: http.adornUrl('/prod/prodTag/info/' + dataForm.value.id),
        method: 'get',
        params: http.adornParams()
      })
        .then(({ data }) => {
          Object.assign(dataForm.value, data)
        })
    }
  })
}

// 将init方法暴露出去，允许父组件调用
defineExpose({ init })

// 表单引用
const dataFormRef = ref(null)

/**
 * 提交表单
 */
const onSubmit = Debounce(() => {
  // 如果排序值为空，设置默认值0
  if (!dataForm.value.seq) {
    dataForm.value.seq = 0
  }

  // 验证表单
  dataFormRef.value?.validate((valid) => {
    if (valid) {
      // 发起HTTP请求，根据是否存在ID来决定是更新还是创建新记录
      http({
        url: http.adornUrl('/prod/prodTag'),
        method: dataForm.value.id ? 'put' : 'post',
        data: http.adornData(dataForm.value)
      })
        .then(() => {
          // 显示成功消息，并在关闭对话框后刷新数据列表
          ElMessage({
            message: '操作成功',
            type: 'success',
            duration: 1500,
            onClose: () => {
              visible.value = false
              emit('refreshDataList')
            }
          })
        })
    }
  })
})
</script>
