<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="userName"
  >
  <el-input
    v-model="dataForm.userName"
  placeholder="登录帐号"
  />
  </el-form-item>

  <!-- 密码输入框 -->
  <el-form-item
    label="密码"
    prop="password"
  :class="{ 'is-required': !dataForm.id }"
  >
  <el-input
    v-model="dataForm.password"
  type="password"
  placeholder="密码"
  />
  </el-form-item>

  <!-- 确认密码输入框 -->
  <el-form-item
    label="确认密码"
    prop="comfirmPassword"
  :class="{ 'is-required': !dataForm.id }"
  >
  <el-input
    v-model="dataForm.comfirmPassword"
  type="password"
  placeholder="确认密码"
  />
  </el-form-item>

  <!-- 邮箱输入框 -->
  <el-form-item
    label="邮箱"
    prop="email"
  >
  <el-input
    v-model="dataForm.email"
  placeholder="邮箱"
  />
  </el-form-item>

  <!-- 手机号输入框 -->
  <el-form-item
    label="手机号"
    prop="mobile"
  >
  <el-input
    v-model="dataForm.mobile"
  maxlength="11"
  placeholder="手机号"
  />
  </el-form-item>

  <!-- 角色选择 -->
  <el-form-item
    label="角色"
    prop="roleIdList"
  >
  <el-checkbox-group v-model="dataForm.roleIdList"> <!-- 绑定选中的角色ID列表 -->
    <el-checkbox
      v-for="role in roleList"
    :key="role.roleId"
    :label="role.roleId"
    >
    {{ role.roleName }}              <!-- 显示角色名称 -->
    </el-checkbox>
  </el-checkbox-group>
  </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>
      <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 { ref, reactive, nextTick } from 'vue'
import { ElMessage } from 'element-plus' // 导入消息提示组件
import { isEmail, isMobile } from '@/utils/validate' // 导入邮箱和手机号格式验证工具函数
import { Debounce } from '@/utils/debounce' // 导入防抖函数
import { encrypt } from '@/utils/crypto' // 导入加密工具函数

// 定义事件发射器
const emit = defineEmits(['refreshDataList'])

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

// 表单数据模型，使用reactive定义以使其成为响应式的
const dataForm = reactive({
  id: 0,                                     // 用户ID，默认为0表示新增
  userName: '',                             // 用户名
  password: '',                             // 密码
  comfirmPassword: '',                      // 确认密码
  email: '',                                // 邮箱
  mobile: '',                               // 手机号
  roleIdList: [],                           // 角色ID列表
  status: 1                                 // 状态，默认为1表示正常
})

// 验证密码是否为空（仅在新增时）
const validatePassword = (rule, value, callback) => {
  if (!dataForm.id && !/\S/.test(value)) { // 如果是新增且密码为空，则报错
    callback(new Error('密码不能为空'))
  } else {
    callback() // 否则通过验证
  }
}

// 验证确认密码是否为空及与密码一致（仅在新增时）
const validateComfirmPassword = (rule, value, callback) => {
  if (!dataForm.id && !/\S/.test(value)) { // 如果是新增且确认密码为空，则清空密码并报错
    dataForm.password = ''
    callback(new Error('确认密码不能为空'))
  } else if (dataForm.password !== value) { // 如果确认密码与密码不一致，则报错
    callback(new Error('确认密码与密码输入不一致'))
  } else {
    callback() // 否则通过验证
  }
}

// 验证邮箱格式
const validateEmail = (rule, value, callback) => {
  if (!isEmail(value)) { // 如果邮箱格式错误，则报错
    callback(new Error('邮箱格式错误'))
  } else {
    callback() // 否则通过验证
  }
}

// 验证手机号格式
const validateMobile = (rule, value, callback) => {
  if (!isMobile(value)) { // 如果手机号格式错误，则报错
    callback(new Error('手机号格式错误'))
  } else {
    callback() // 否则通过验证
  }
}

// 表单验证规则，使用reactive定义以使其成为响应式的
const dataRule = reactive({
  userName: [
    { required: true, message: '用户名不能为空', trigger: 'blur' }, // 必填项
    { pattern: /\s\S+|\S+\s|\S/, message: '请输入正确的用户名', trigger: 'blur' } // 正则表达式验证
  ],
  password: [
    { validator: validatePassword, trigger: 'blur' } // 自定义验证规则
  ],
  comfirmPassword: [
    { validator: validateComfirmPassword, trigger: 'blur' } // 自定义验证规则
  ],
  email: [
    { required: true, message: '邮箱不能为空', trigger: 'blur' }, // 必填项
    { validator: validateEmail, trigger: 'blur' } // 自定义验证规则
  ],
  mobile: [
    { required: true, message: '手机号不能为空', trigger: 'blur' }, // 必填项
    { validator: validateMobile, trigger: 'blur' } // 自定义验证规则
  ]
})

// 存储角色列表的响应式变量
const roleList = ref([])

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

/**
 * 初始化方法，接收可选的用户ID参数
 * @param id 用户ID（可选）
 */
const init = (id) => {
  dataForm.id = id || 0 // 如果提供了id，则设置为编辑模式；否则设置为新增模式

  // 获取角色列表并初始化对话框
  http({
    url: http.adornUrl('/sys/role/list'),   // API端点
    method: 'get',                          // 请求方式
    params: http.adornParams()              // 请求参数
  }).then(({ data }) => {
    roleList.value = data // 更新角色列表
  }).then(() => {
    visible.value = true // 显示对话框
    return nextTick() // 等待DOM更新
  }).then(() => {
    dataFormRef.value?.resetFields() // 重置表单数据
  }).then(() => {
    if (dataForm.id) { // 如果是编辑模式，则获取用户详情
      http({
        url: http.adornUrl(`/sys/user/info/${dataForm.id}`), // API端点
        method: 'get',                                       // 请求方式
        params: http.adornParams()                          // 请求参数
      }).then(({ data }) => {
        dataForm.userName = data.username // 设置用户名
        dataForm.email = data.email       // 设置邮箱
        dataForm.mobile = data.mobile     // 设置手机号
        dataForm.roleIdList = data.roleIdList // 设置角色ID列表
        dataForm.status = data.status     // 设置状态
      })
    }
  })
}

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

/**
 * 提交表单方法
 */
const onSubmit = Debounce(() => { // 使用防抖函数防止快速点击多次提交
  dataFormRef.value?.validate((valid) => { // 验证表单
    if (valid) { // 如果表单验证通过
      http({
        url: http.adornUrl('/sys/user'),   // API端点
        method: dataForm.id ? 'put' : 'post', // 如果有id则是编辑操作，否则为新增操作
        data: http.adornData({
          userId: dataForm.id || undefined, // 用户ID，新增时不发送
          username: dataForm.userName,      // 用户名
          password: encrypt(dataForm.password), // 加密后的密码
          email: dataForm.email,            // 邮箱
          mobile: dataForm.mobile,          // 手机号
          status: dataForm.status,          // 状态
          roleIdList: dataForm.roleIdList   // 角色ID列表
        })
      }).then(() => {
        ElMessage({
          message: '操作成功',
          type: 'success',
          duration: 1500,
          onClose: () => {
            visible.value = false // 关闭对话框
            emit('refreshDataList') // 发射刷新事件通知父组件刷新数据列表
          }
        })
      })
    }
  })
})
</script>
