<template>
  <!-- 对话框组件 -->
  <el-dialog
    v-model="visible"
    :title="!dataForm.areaId ? '新增' : '修改'"
    :close-on-click-modal="false"
  >
    <!-- 表单组件 -->
    <el-form
      ref="dataFormRef"
      :model="dataForm"
      :rules="dataRule"
      label-width="100px"
      @keyup.enter="onSubmit()"
    >
      <!-- 地区名称输入项 -->
      <el-form-item
        label="地区名称"
        prop="areaName"
      >
        <el-input
          v-model="dataForm.areaName"
          placeholder="请输入地区名称"
          maxlength="50"
          show-word-limit
        />
      </el-form-item>
      <!-- 上级地区选择项 -->
      <el-form-item
        label="上级地区"
        prop="parentId"
      >
        <el-cascader
          v-model="selectedOptions"
          expand-trigger="hover"
          :options="areaList"
          :props="categoryTreeProps"
          change-on-select
          filterable
          @change="handleChange"
        />
      </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 } from '@/utils'
import { Debounce } from '@/utils/debounce'
import { ref, reactive, nextTick, defineEmits, defineExpose } from 'vue'

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

// 定义表单验证规则
const dataRule = reactive({
  areaName: [
    { required: true, message: '区域名称不能为空', trigger: 'blur' },
    { pattern: /\s\S+|S+\s|\S/, message: '请输入正确的区域名称', trigger: 'blur' }
  ]
})

// 定义可见性状态、地区列表、表单数据等响应式变量
const visible = ref(false)
const areaList = ref([])
const dataForm = ref({
  areaId: '',
  areaName: null,
  parentId: null,
  level: null
})
const categoryTreeProps = reactive({
  value: 'areaId',
  label: 'areaName',
  checkStrictly: true
})
const selectedOptions = ref([])

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

// 初始化方法，接收areaId作为参数
const init = (areaId) => {
  dataForm.value.areaId = areaId || 0 // 设置当前编辑的地区ID
  visible.value = true // 打开对话框
  selectedOptions.value = [] // 清空已选项

  // 使用nextTick确保DOM更新完毕后执行
  nextTick(() => {
    dataFormRef.value?.resetFields() // 重置表单
    if (dataForm.value.areaId) {
      // 如果有areaId，则获取该地区的详情
      http({
        url: http.adornUrl('/admin/area/info/' + dataForm.value.areaId),
        method: 'get',
        params: http.adornParams()
      }).then(({ data }) => {
        dataForm.value = data // 填充表单数据
        selectedOptions.value = dataForm.value.parentId // 设置上级地区
        // 更新分类树属性（这行代码可能无效，因为categoryTreeProps是reactive对象）
        categoryTreeProps.areaId = dataForm.value.areaId
        categoryTreeProps.areaName = dataForm.value.areaName
      })
    }

    // 获取所有地区列表并转换为树结构
    http({
      url: http.adornUrl('/admin/area/list'),
      method: 'get',
      params: http.adornParams()
    }).then(({ data }) => {
      areaList.value = treeDataTranslate(data, 'areaId', 'parentId')
    })
  })
}

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

// 分页信息
const page = {
  total: 0, // 总页数
  currentPage: 1, // 当前页数
  pageSize: 20 // 每页显示多少条
}

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

// 处理上级地区选择变化
const handleChange = (val) => {
  // 更新表单中parentId字段的值为最新选择的上级地区ID
  dataForm.value.parentId = val[val.length - 1]
}
</script>
