<template>
  <!-- 使用el-dialog组件创建一个对话框，v-model绑定visible控制显示/隐藏 -->
  <el-dialog
    v-model="visible"
    :title="!dataForm.currentId ? '新增' : '修改'" <!-- 根据currentId判断是新增还是修改 -->
  :close-on-click-modal="false" <!-- 点击模态框区域不关闭对话框 -->
  >
  <!-- el-form表单，ref引用dataFormRef以便在脚本中操作表单 -->
  <el-form
    ref="dataFormRef"
    :model="dataForm"
    :rules="dataRule"
    label-width="80px"
    @keyup.enter="onSubmit()" <!-- 按下Enter键时触发提交 -->
  >
  <!-- 分类图片表单项，仅当type不是2时显示 -->
  <el-form-item
    v-if="dataForm.type !== 2"
    label="分类图片"
    prop="pic"
  >
    <!-- 自定义的图片上传组件 -->
    <pic-upload
      v-model="dataForm.pic"
      @update:model-value="checkPic" <!-- 图片更新后重新校验 -->
    />
  </el-form-item>

  <!-- 分类名称表单项，仅当type不是2时显示 -->
  <el-form-item
    v-if="dataForm.type !== 2"
    label="分类名称"
    prop="categoryName"
  >
    <el-input
      v-model="dataForm.categoryName"
      controls-position="right"
      :min="0"
      label="分类名称"
    />
  </el-form-item>

  <!-- 上级分类选择器 -->
  <el-form-item label="上级分类">
    <el-cascader
      v-model="selectedCategory"
      expand-trigger="hover"
      :options="categoryList"
      :props="categoryTreeProps"
      change-on-select
      :clearable="true"
      @change="handleChange" <!-- 上级分类变化时触发 -->
    />
  </el-form-item>

  <!-- 排序号表单项，仅当type不是2时显示 -->
  <el-form-item
    v-if="dataForm.type !== 2"
    label="排序号"
    prop="seq"
  >
    <el-input-number
      v-model="dataForm.seq"
      controls-position="right"
      :min="0"
      label="排序号"
    />
  </el-form-item>

  <!-- 状态选择项 -->
  <el-form-item
    label="状态"
    prop="status"
  >
    <el-radio-group v-model="dataForm.status">
      <el-radio :label="0">下线</el-radio>
      <el-radio :label="1">正常</el-radio>
    </el-radio-group>
  </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 {treeDataTranslate, idList} from '@/utils'
import {Debounce} from '@/utils/debounce'

// 定义事件emit来刷新数据列表
const emit = defineEmits(['refreshDataList'])

// 控制对话框显示与隐藏
const visible = ref(false)

// 表单数据对象，使用reactive定义响应式数据
const dataForm = reactive({
  categoryId: 0,
  currentId: 0,
  grade: 0,
  categoryName: '',
  seq: 1,
  status: 1,
  parentId: 0,
  pic: ''
})

// 表单验证规则
const dataRule = reactive({
  categoryName: [
    {required: true, message: '分类名称不能为空', trigger: 'blur'},
    {pattern: /\s\S+|S+\s|\S/, message: '请输入正确的分类名称', trigger: 'blur'}
  ],
  pic: [
    {required: true, message: '分类图片不能为空', trigger: 'blur'}
  ]
})

// 分类列表数据
const categoryList = ref([])

// 选中的分类路径
const selectedCategory = ref([])

// 上级分类联级选择器配置
const categoryTreeProps = reactive({
  value: 'categoryId',
  label: 'categoryName',
  checkStrictly: true
})

// 提交锁，防止重复提交
const isSubmit = ref(false)

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

// 初始化方法，接收id参数以决定是新增还是编辑
const init = (id) => {
  dataForm.currentId = id || 0
  dataForm.categoryId = id || 0
  // 获取分类列表
  http({
    url: http.adornUrl('/prod/category/listCategory'),
    method: 'get',
    params: http.adornParams()
  })
    .then(({data}) => {
      categoryList.value = treeDataTranslate(data, 'categoryId', 'parentId')
    })
    .then(() => {
      visible.value = true
      nextTick(() => {
        dataFormRef.value?.resetFields() // 重置表单
        selectedCategory.value = []
      })
    })
    .then(() => {
      if (dataForm.categoryId) {
        // 如果有ID，则获取具体分类信息进行编辑
        http({
          url: http.adornUrl(`/prod/category/info/${dataForm.categoryId}`),
          method: 'get',
          params: http.adornParams()
        })
          .then(({data}) => {
            Object.assign(dataForm, data)
            selectedCategory.value = idList(categoryList.value, data.parentId, 'categoryId', 'children').reverse()
          })
      }
    })
}

// 暴露init方法供外部调用
defineExpose({init})

// 上级分类变化时触发
const handleChange = (val) => {
  dataForm.parentId = val[val.length - 1]
}

// 表单提交，使用防抖处理
const onSubmit = Debounce(() => {
  // 设置grade值
  dataForm.grade = selectedCategory.value.length - 1

  // 验证表单有效性
  dataFormRef.value?.validate((valid) => {
    if (valid) {
      if (isSubmit.value) return // 防止重复提交

      isSubmit.value = true

      // 发送请求保存或更新分类信息
      http({
        url: http.adornUrl('/prod/category'),
        method: dataForm.categoryId ? 'put' : 'post',
        data: http.adornData({
          ...dataForm
        })
      })
        .then(() => {
          ElMessage.success('操作成功')
          isSubmit.value = false
          visible.value = false
          emit('refreshDataList') // 触发父组件刷新列表
        })
        .catch(() => {
          isSubmit.value = false
        })
    }
  })
})

/**
 * 重新校验表单pic字段
 */
const checkPic = () => {
  dataFormRef.value?.validateField('pic')
}
</script>
