<template>
  <div class="loginPage">
    <section class="mobileMain" v-if="$isMobile">
      <header class="headerBox2">
        <img
          @click="handelJump(`/`)"
          src="../../assets/mobile/login/LOGO.svg"
          alt="logo"
        />
        <span class="title">{{ $t(`home.MRegister`) }}</span>
        <span></span>
      </header>
      <div class="imgTop">
        <img
          src="../../assets/mobile/login/registertop.svg"
          alt="register"
          loading="lazy"
        />
      </div>
      <section class="formInput">
        <el-form
          :model="registerForm"
          status-icon
          :rules="registerRules"
          ref="registerForm"
          class="demo-ruleForm"
        >
          <el-form-item prop="email">
            <el-input
              type="email"
              prefix-icon="el-icon-message"
              v-model="registerForm.email"
              @input="handleEmailInput($event)"
              autocomplete="off"
              :placeholder="$t(`user.Account`)"
            ></el-input>
          </el-form-item>
          <el-form-item prop="emailCode">
            <div class="verificationCode">
              <el-input
                type="text"
                prefix-icon="el-icon-chat-line-square"
                v-model="registerForm.emailCode"
                @input="handleCodeInput($event)"
                autocomplete="off"
                :placeholder="$t(`user.verificationCode`)"
              ></el-input>
              <el-button
                class="codeBtn"
                :disabled="btnDisabled"
                @click="handelCode"
                ><span v-if="countDownTime < 60 && countDownTime > 0">{{
                  countDownTime
                }}</span
                >{{ $t(bthText) }}</el-button
              >
            </div>
          </el-form-item>
          <el-form-item prop="password">
            <el-input
              :title="$t(`user.passwordPrompt`)"
              type="password"
              v-model="registerForm.password"
              @input="handlePasswordInput($event)"
              prefix-icon="el-icon-unlock"
              autocomplete="off"
              :placeholder="$t(`user.password`)"
              show-password
            ></el-input>
            <p class="remind" :title="$t(`user.passwordPrompt`)">
              {{ $t(`user.passwordPrompt`) }}
            </p>
          </el-form-item>

          <el-form-item prop="confirmPassword">
            <el-input
              type="password"
              v-model="registerForm.confirmPassword"
              @input="handleConfirmPasswordInput($event)"
              prefix-icon="el-icon-unlock"
              autocomplete="off"
              :placeholder="$t(`user.confirmPassword`)"
              show-password
            ></el-input>
          </el-form-item>
          <div class="register">
            <span
              >{{ $t(`user.havingAnAccount`) }}
              <span class="goLogin" @click="goLogin">{{
                $t(`user.login`)
              }}</span>
            </span>
          </div>

          <el-form-item>
            <el-button
              style="
                width: 100%;
                background: #661fff;
                color: aliceblue;
                margin-top: 6%;
              "
              :loading="registerLoading"
              @click="handleRegister"
              >{{ $t(`user.register`) }}</el-button
            >

            <div style="text-align: left">
              <el-radio @input="handelRadio" v-model="radio" label="zh"
                >简体中文</el-radio
              >
              <el-radio @input="handelRadio" v-model="radio" label="en"
                >English</el-radio
              >
            </div>
          </el-form-item>
        </el-form>
      </section>
    </section>

    <section class="loginModular" v-else>
      <div class="leftBox">
        <img
          class="logo"
          src="../../assets/img/WILOGO.png"
          alt="logo"
          @click="handleClick"
        />
        <img src="../../assets/img/reincon.png" alt="Register Mining Pool" />
      </div>
      <div class="loginBox">
        <div class="closeBox" @click="handleClick">
          <i class="iconfont icon-guanbi1 close"></i>
        </div>
        <el-form
          :model="registerForm"
          status-icon
          :rules="registerRules"
          ref="registerForm"
          class="demo-ruleForm"
        >
          <el-form-item>
            <p class="loginTitle">{{ $t(`user.newUser`) }}</p>
          </el-form-item>

          <el-form-item prop="email">
            <el-input
              type="email"
              prefix-icon="el-icon-message"
              v-model="registerForm.email"
              @input="handleEmailInput($event)"
              autocomplete="off"
              :placeholder="$t(`user.Account`)"
            ></el-input>
          </el-form-item>
          <el-form-item prop="emailCode">
            <div class="verificationCode">
              <el-input
                type="text"
                prefix-icon="el-icon-chat-line-square"
                v-model="registerForm.emailCode"
                @input="handleCodeInput($event)"
                autocomplete="off"
                :placeholder="$t(`user.verificationCode`)"
              ></el-input>
              <el-button
                class="codeBtn"
                :disabled="btnDisabled"
                @click="handelCode"
                ><span v-if="countDownTime < 60 && countDownTime > 0">{{
                  countDownTime
                }}</span
                >{{ $t(bthText) }}</el-button
              >
            </div>
          </el-form-item>
          <el-form-item prop="password">
            <el-input
              :title="$t(`user.passwordPrompt`)"
              type="password"
              v-model="registerForm.password"
              @input="handlePasswordInput($event)"
              prefix-icon="el-icon-unlock"
              autocomplete="off"
              :placeholder="$t(`user.password`)"
              show-password
            ></el-input>
            <p class="remind" :title="$t(`user.passwordPrompt`)">
              {{ $t(`user.passwordPrompt`) }}
            </p>
          </el-form-item>

          <el-form-item prop="confirmPassword">
            <el-input
              type="password"
              v-model="registerForm.confirmPassword"
              @input="handleConfirmPasswordInput($event)"
              prefix-icon="el-icon-unlock"
              autocomplete="off"
              :placeholder="$t(`user.confirmPassword`)"
              show-password
            ></el-input>
          </el-form-item>
          <div class="register">
            <span
              >{{ $t(`user.havingAnAccount`) }}
              <span class="goLogin" @click="goLogin">{{
                $t(`user.login`)
              }}</span>
            </span>
          </div>

          <el-form-item>
            <el-button
              style="
                width: 100%;
                background: #661fff;
                color: aliceblue;
                margin-top: 6%;
              "
              :loading="registerLoading"
              @click="handleRegister"
              >{{ $t(`user.register`) }}</el-button
            >

            <div style="text-align: left">
              <el-radio @input="handelRadio" v-model="radio" label="zh"
                >简体中文</el-radio
              >
              <el-radio @input="handelRadio" v-model="radio" label="en"
                >English</el-radio
              >
            </div>
          </el-form-item>
        </el-form>
      </div>
    </section>
  </div>
</template>
  
  <script>
import { getRegister, getRegisterCode } from "../../api/login";
import { encryption } from "../../utils/fun";
import { validatePassword, formatPasswordErrors } from "../../utils/passwordValidator";
export default {
  data() {
    // const equalToPassword = (rule, value, callback) => {
    //   if (this.registerForm.password !== value) {
    //     callback(new Error("两次输入的密码不一致"));
    //   } else {
    //     callback();
    //   }
    // };
    return {
      registerForm: {
        // userName: "",
        password: "",
        email: "",
        emailCode: "",
        confirmPassword: "",
      },
      registerRules: {
        userName: [
          { required: true, trigger: "blur", message: "请输入您的账号" },
          {
            min: 3,
            max: 16,
            message: "用户账号长度必须介于 3 和 16 之间",
            trigger: "blur",
          },
        ],
        email: [
          {
            required: true,
            trigger: "blur",
            message: this.$t(`user.emailVerification`),
            type: "email",
          },
        ],
        password: [
          {
            required: true,
            trigger: "blur",
            message: this.$t(`user.inputPassword`),
          },
          {
            min: 8,
            max: 32,
            message: this.$t(`user.passwordVerification`),
            trigger: "blur",
          },
        ],
        confirmPassword: [
          {
            required: true,
            trigger: "blur",
            message: this.$t(`user.secondaryPassword`),
          },
          // { required: true, validator: equalToPassword, trigger: "blur" },
        ],
        emailCode: [
          {
            required: true,
            trigger: "blur",
            message: this.$t(`user.inputCode`),
          },
        ],
      },
      radio: `zh`,
      loading: false,
      codeParams: {
        // userName: "",
        email: "",
      },
      btnDisabled: false,
      bthText: "user.obtainVerificationCode",
      time: "",
      registerLoading: false,
      countDownTime: 60,
      timer: null,
      lang: "zh",
    };
  },
  computed: {
    countDown() {
      const minutes = Math.floor(this.countDownTime / 60);
      const seconds = this.countDownTime % 60;
      const m = minutes < 10 ? "0" + minutes : minutes;
      const s = seconds < 10 ? "0" + seconds : seconds;
      return `${s}`;
      // return`${s}`
    },
  },
  created() {
    if (window.sessionStorage.getItem("register_time")) {
      this.countDownTime = Number(
        window.sessionStorage.getItem("register_time")
      );
      this.startCountDown();
      this.btnDisabled = true;
      this.bthText = `user.again`;
    }
  },
  watch: {
    '$route'(to) {
      // 路由变化时自动同步语言和radio
      const match = to.path.match(/^\/(zh|en)(\/|$)/);
      if (match) {
        this.radio = match[1];
        this.lang = match[1];
        this.$i18n.locale = match[1];
        localStorage.setItem("lang", match[1]);
      }
    },
    "$i18n.locale": function () {
      this.translate();
    },
  },
  mounted() {
    // this.lang = this.$i18n.locale;
    // this.radio = localStorage.getItem("lang")
    //   ? localStorage.getItem("lang")
    //   : "en";

// 获取当前路由路径
const path = this.$route.path;
  // 匹配 /zh/ 或 /en/ 作为语言前缀
  const match = path.match(/^\/(zh|en)(\/|$)/);
  if (match) {
    this.radio = match[1];
    this.lang = match[1];
    this.$i18n.locale = match[1];
    localStorage.setItem("lang", match[1]);
  } else {
    // fallback 到 localStorage 或 "en"
    this.radio = localStorage.getItem("lang") || "en";
    this.lang = this.radio;
    this.$i18n.locale = this.radio;
  }



    for (const key in this.registerForm) {
      this.registerForm[key] = "";
    }
  },
  methods: {
    handelJump(url) {
      const cleanPath = url.startsWith("/") ? url.slice(1) : url;
      this.$router.push(`/${this.lang}/${cleanPath}`);
    },
    translate() {
      this.registerRules = {
        userName: [
          {
            required: true,
            trigger: "blur",
            message: this.$t(`user.inputAccount`),
          },
          {
            min: 3,
            max: 16,
            message: "用户账号长度必须介于 3 和 16 之间",
            trigger: "blur",
          },
        ],
        email: [
          {
            required: true,
            trigger: "blur",
            message: this.$t(`user.emailVerification`),
            type: "email",
          },
        ],
        password: [
          {
            required: true,
            trigger: "blur",
            message: this.$t(`user.inputPassword`),
          },
          {
            min: 8,
            max: 32,
            message: this.$t(`user.passwordVerification`),
            trigger: "blur",
          },
        ],
        confirmPassword: [
          {
            required: true,
            trigger: "blur",
            message: this.$t(`user.secondaryPassword`),
          },
          // { required: true, validator: equalToPassword, trigger: "blur" },
        ],
        emailCode: [
          {
            required: true,
            trigger: "blur",
            message: this.$t(`user.inputCode`),
          },
        ],
      };
    },
    async fetchRegisterCode(params) {
      const data = await getRegisterCode(params);
      if (data && data.code === 200) {
        this.$message({
          message: this.$t(`user.verificationCodeSuccessful`),
          type: "success",
          showClose: true,
        });
      }
    },
    handelCode() {
      // this.codeParams.userName = this.registerForm.userName;
      this.codeParams.email = this.registerForm.email;
      // if (!this.codeParams.userName) {
      //     this.$message({
      //       message: "请输入账号",
      //       type: "error",
      //     });
      //     return
      // }
      //邮箱格式验证 /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
      const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/;

      let isMailbox = emailRegex.test(this.codeParams.email);

      if (!this.codeParams.email || !isMailbox) {
        this.$message({
          message: this.$t(`user.emailVerification`),
          type: "error",
          showClose: true,
        });
        return;
      }

      this.fetchRegisterCode(this.codeParams);

      if (window.sessionStorage.getItem("register_time") == null) {
        this.startCountDown();
      } else {
        this.countDownTime = Number(
          window.sessionStorage.getItem("register_time")
        );
        this.startCountDown();
      }

      // this.time = 60;
      //     let timer = setInterval(()=>{
      //       if ( this.time) {
      //         this.time--
      //         this.btnDisabled = true;
      //         // this.bthText= this.time+`s后重新获取`
      //         this.bthText= `user.again`
      //       }else {
      //         this.btnDisabled = false;
      //         this.bthText="user.obtainVerificationCode"
      //         this.time = "";
      //         clearTimeout(timer)
      //       }
      //     },1000)
    },

    startCountDown() {
      this.timer = setInterval(() => {
        if (this.countDownTime <= 1) {
          //当监测到countDownTime为0时,清除计数器并且移除sessionStorage,然后执行提交试卷逻辑
          clearInterval(this.timer);
          sessionStorage.removeItem("register_time");

          this.countDownTime = 60;
          this.btnDisabled = false;
          this.bthText = `user.obtainVerificationCode`;
        } else if (this.countDownTime > 0) {
          //每秒让countDownTime -1秒,并设置到sessionStorage中
          this.countDownTime--;
          this.btnDisabled = true;
          this.bthText = `user.again`;
          window.sessionStorage.setItem("register_time", this.countDownTime);
        }
      }, 1000);
    },

    goLogin() {
      this.$router.push(`/${this.lang}/login`);
    },
    handelRadio(val) {
      // 保存旧的语言值
      const oldLang = this.lang;

      // 更新语言设置
      this.lang = val;
      this.$i18n.locale = val;
      localStorage.setItem("lang", val);

      // 更新当前路由的语言部分
      const currentPath = this.$route.path;
      const newPath = currentPath.replace(`/${oldLang}`, `/${val}`);

      // 保持查询参数
      this.$router
        .push({
          path: newPath,
          query: this.$route.query,
        })
        .catch((err) => {
          if (err.name !== "NavigationDuplicated") {
            console.error("Navigation failed:", err);
          }
        });
    },
    //点击注册
    handleRegister() {
      this.$refs.registerForm.validate((valid) => {
        if (valid) {
          this.loading = true;

          //用户名规则1.长度限制：3<=用户名<=16; 字符限制：仅允许使用字母、数字、下划线 用户名必须以字母开头
          // const regex = /^[a-zA-Z][a-zA-Z0-9_]{2,15}$/; // 正则表达式
          // const isValid = regex.test(this.registerForm.userName);
          // if (!isValid) {
          //
          //   this.$message({
          //     message: `请检查账户是否输入正确`,
          //     type: "error",
          //   });

          //   return;
          // }

          //邮箱格式验证
          const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/;
          let isMailbox = emailRegex.test(this.registerForm.email);

          if (!this.registerForm.email || !isMailbox) {
            this.$message({
              message: this.$t(`user.emailVerification`),
              type: "error",
              showClose: true,
            });
            return;
          }

          // 密码验证 - 使用优化后的详细校验逻辑
          const validation = validatePassword(this.registerForm.password);
          if (!validation.valid) {
            // 生成友好的逐项错误提示
            const errorMessage = formatPasswordErrors(validation.errors, this.$t.bind(this));
            this.$message({
              message: errorMessage,
              type: "error",
              duration: 5000, // 延长显示时间,因为错误信息可能有多条
            });

            return;
          }
          this.registerLoading = true;
          //加密
          const form = { ...this.registerForm };
          form.password = encryption(this.registerForm.password);
          form.confirmPassword = encryption(this.registerForm.confirmPassword);

          getRegister(form)
            .then((res) => {
              const userName = this.registerForm.userName;
              if (res.code == 200) {
                this.$alert(
                  `<font color='red'>${this.$t(`user.congratulations`)}</font>`,
                  `${this.$t(`user.system`)}`,
                  {
                    dangerouslyUseHTMLString: true,
                  }
                )
                  .then(() => {
                    this.$router.push(`/${this.lang}/login`);
                  })
                  .catch(() => {});
              }
            })
            .catch(() => {
              this.loading = false;
              if (this.captchaOnOff) {
                // this.getCode();
              }
            });

          this.registerLoading = false;
        }
      });
    },

    handleClick() {
      this.$router.push(`/${this.lang}`);
    },
    /**
     * 去除输入值中的空格
     * @param {string} value - 输入值
     * @returns {string} 去除空格后的值
     */
    removeSpaces(value) {
      if (typeof value === 'string') {
        return value.replace(/\s/g, '');
      }
      return value;
    },
    /**
     * 处理邮箱输入，自动去除空格
     * @param {string} value - 输入值
     */
    handleEmailInput(value) {
      this.registerForm.email = this.removeSpaces(value);
    },
    /**
     * 处理验证码输入，自动去除空格
     * @param {string} value - 输入值
     */
    handleCodeInput(value) {
      this.registerForm.emailCode = this.removeSpaces(value);
    },
    /**
     * 处理密码输入，自动去除空格
     * @param {string} value - 输入值
     */
    handlePasswordInput(value) {
      this.registerForm.password = this.removeSpaces(value);
    },
    /**
     * 处理确认密码输入，自动去除空格
     * @param {string} value - 输入值
     */
    handleConfirmPasswordInput(value) {
      this.registerForm.confirmPassword = this.removeSpaces(value);
    },
  },
};
</script>
  
  <style scoped lang="scss">
.loginPage {
  width: 100%;
  height: 100%;
  background-color: #fff;
  display: flex;
  justify-content: center;
  align-items: center;
  background-image: url(../../assets/img/logBg.png);
  background-size: cover;
  background-repeat: no-repeat;
  .loginModular {
    width: 53%;
    height: 68%;
    display: flex;
    border-radius: 10px;
    overflow: hidden;
    box-shadow: 0px 0px 20px 18px #d6d2ea;
    // box-shadow: 0px 0px 20PX 30PX #000;
  }
  .remind {
    font-size: 0.8em;
    padding: 0;
    margin: 0;
    min-height: 15px;
    line-height: 15px;
    color: #ff4081;
    // text-overflow: ellipsis;
    // overflow: hidden;
    // white-space: nowrap;
    // cursor: pointer;
  }
  .leftBox {
    width: 47%;
    height: 100%;
    background-image: linear-gradient(150deg, #18b7e6 -20%, #651fff 60%);
    position: relative;
    img {
      width: 100%;
      position: absolute;
      right: -15%;
      bottom: 0;
      z-index: 99;
    }
    .logo {
      position: absolute;
      left: 30px;
      top: 18px;
      width: 22%;
    }
  }
}
.el-form {
  width: 90%;
  padding: 0px 20px 50px 20px;
}
.el-form-item {
  width: 100%;
}
.loginBox {
  width: 53%;
  // box-shadow: 0PX 0PX 5PX 1PX #ccc;

  display: flex;
  justify-content: center;
  align-items: center;
  border-radius: 10px;
  position: relative;
  flex-direction: column;
  overflow: hidden;
  padding: 0px 25px;
  background: #fff;
  .demo-ruleForm {
    height: 100%;
    padding-top: 3%;
  }
  img {
    width: 18%;
    position: absolute;
    top: 20px;
    right: 30px;
    cursor: pointer;
  }
  .closeBox {
    position: absolute;
    top: 18px;
    right: 30px;
    cursor: pointer;
    .close {
      font-size: 1.3em;
    }
  }
  .closeBox:hover {
    color: #661fff;
  }
}
.loginTitle {
  font-size: 20px;
  font-weight: 600;
  margin-bottom: 30px;
  text-align: center;
}
.loginColor {
  width: 100%;
  height: 15px;
  background: #661fff;
}
.langBox {
  display: flex;
  justify-content: space-between;
  align-content: center;
}
.register {
  display: flex;
  justify-content: start;
  /* background: #CCC; */
  margin: 0;
  font-size: 12px;
  height: 10px;

  .goLogin:hover {
    color: #661fff;
    cursor: pointer;
  }
}
.forget {
  margin-left: 10px;
}
.forgotPassword {
  display: inline-block;
  width: 20%;
}

.verificationCode {
  display: flex;
  .codeBtn {
    font-size: 13px;
    margin-left: 2px;
  }
}

// 手机端适配
@media screen and (min-width: 220px) and (max-width: 1279px) {
  .mobileMain {
    width: 100vw;
    min-height: 100vh;
    background: #fff;
    background-image: url("../../assets/mobile/login/bgtop.svg");
    background-repeat: no-repeat;
    background-size: 115%;
    background-position: 49% 47%;
    box-sizing: border-box;
  }

  .headerBox2 {
    width: 100%;
    height: 60px;
    // background: palegoldenrod;
    // border-bottom: 1px solid #ccc;
    display: flex;
    align-items: center;
    justify-content: space-between;
    line-height: 60px;
    padding: 0px 20px;
    padding-top: 10px;
    box-shadow: 0px 0px 2px 1px #ccc;
    img {
      width: 30px;
    }
    .title {
      height: 100%;
      font-weight: 600;
    }
  }

  .imgTop {
    width: 100%;
    display: flex;
    justify-content: center;
    margin-top: 2%;
    img {
      height: 159px;
    }
  }

  .formInput {
    width: 100%;
    display: flex;
    justify-content: center;
  }
  .register {
    .goLogin {
      color: #651fff;
      padding: 0px 8px;
    }
  }
}
</style>