<template>
  <el-form ref="pwdRef" :model="user" :rules="rules" label-width="80px" v-if="roles.includes('jg') || roles.includes('admin')
  ||roles.includes('superadmin')||roles.includes('xm')">
    <el-form-item label="旧密码" prop="oldPassword">
      <el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" show-password />
    </el-form-item>
    <el-form-item label="新密码" prop="newPassword">
      <el-input v-model="user.newPassword" placeholder="请输入新密码,需要满足8位以上，必须包含数字、大小写字母、特殊字符，定期更换不超过90天" type="password" show-password />
    </el-form-item>
    <el-form-item label="确认密码" prop="confirmPassword">
      <el-input v-model="user.confirmPassword" placeholder="请确认新密码" type="password" show-password />
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submit">保存</el-button>
      <el-button type="danger" @click="close">关闭</el-button>
    </el-form-item>
  </el-form>
  <el-button type="primary" v-if="roles.includes('expert')" @click="setPassWord">修改密码</el-button>
</template>

<script setup lang="ts">
import { updateUserPwd } from '@/api/system/user';
import type { ResetPwdForm } from '@/api/system/user/types';
import useUserStore from "@/store/modules/user";
import {UNIFIED_AUTHENTICATION_PASSWORD} from "@/config";
const userStore = useUserStore();
const roles = ref(userStore.roles);

const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const pwdRef = ref<ElFormInstance>();
const user = ref<ResetPwdForm>({
  oldPassword: '',
  newPassword: '',
  confirmPassword: ''
});

const equalToPassword = (rule: any, value: string, callback: any) => {
  if (user.value.newPassword !== value) {
    callback(new Error('两次输入的密码不一致'));
  } else {
    callback();
  }
};
function validatePassword(rule:any, value:string,callback:any) {
  // 定义正则表达式，分别匹配大写字母、小写字母、数字和特殊字符
  const uppercaseRegex = /[A-Z]/;
  const lowercaseRegex = /[a-z]/;
  const digitRegex = /[0-9]/;
  const specialCharRegex = /[^a-zA-Z0-9]/;

  // 检查密码是否包含大写字母
  if (!uppercaseRegex.test(value)) {
    return callback(new Error('新密码必须含有大小写字母、数字、特殊字符'));
  }
  // 检查密码是否包含小写字母
  if (!lowercaseRegex.test(value)) {
    return callback(new Error('新密码必须含有大小写字母、数字、特殊字符'));
  }
  // 检查密码是否包含数字
  if (!digitRegex.test(value)) {
    return callback(new Error('新密码必须含有大小写字母、数字、特殊字符'));
  }
  // 检查密码是否包含特殊字符
  if (!specialCharRegex.test(value)) {
    return callback(new Error('新密码必须含有大小写字母、数字、特殊字符'));
  }
  callback();
}

const rules = ref({
  oldPassword: [{ required: true, message: '旧密码不能为空', trigger: 'blur' }],
  newPassword: [
    { required: true, message: '新密码不能为空', trigger: 'blur' },
    {
      min: 8,
      max: 16,
      message: '长度在 8 到 16 个字符',
      trigger: 'blur'
    },
    {
      validator: validatePassword,
      trigger: 'blur'
    },
      { pattern: /[0-9]/, message: '密码必须包含至少一个数字', trigger: 'blur' },
      { pattern: /[A-Z]/, message: '密码必须包含至少一个大写字母', trigger: 'blur' },
      { pattern: /[a-z]/, message: '密码必须包含至少一个小写字母', trigger: 'blur' },
      { pattern: /[^a-zA-Z0-9]/, message: '密码必须包含至少一个特殊字符', trigger: 'blur' }
  ],
  confirmPassword: [
    { required: true, message: '确认密码不能为空', trigger: 'blur' },
    {
      required: true,
      validator: equalToPassword,
      trigger: 'blur'
    }
  ]
});

/** 提交按钮 */
const submit = () => {
  pwdRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      await updateUserPwd(user.value.oldPassword, user.value.newPassword);
      proxy?.$modal.msgSuccess('修改成功');
    }
  });
};
/** 关闭按钮 */
const close = () => {
  proxy?.$tab.closePage();
};
const setPassWord = () => {
  window.open(UNIFIED_AUTHENTICATION_PASSWORD,'_self')
}
</script>
