<template>
  <div class="simple-login">
    <van-overlay :show="show" @click="show = false">
      <div class="wrapper flex justify-center items-center" @click.stop>
        <div class="block flex items-center flex-col py-6">
          <div class="close" @click="onClose"></div>
          <div class="title pb-6">
            {{
              formType === 'login'
                ? '登录'
                : formType === 'register'
                ? '注册'
                : '忘记密码'
            }}
          </div>
          <div class="form">
            <div class="form-item mb-4">
              <input
                type="text"
                placeholder="手机号"
                v-model="formData.mobile"
                maxlength="11"
              />
            </div>
            <div class="form-item mb-4 code" v-if="formType !== 'login'">
              <input
                type="text"
                placeholder="验证码"
                class="code"
                v-model="formData.verifyCode"
                maxlength="6"
              />
              <span class="send" @click="onSend">{{ sendCodeBtnText }}</span>
            </div>
            <div class="form-item mb-4">
              <input
                type="password"
                placeholder="密码"
                v-model="formData.password"
                maxlength="11"
              />
            </div>
            <div class="form-item mb-4" v-if="formType !== 'login'">
              <input
                type="password"
                placeholder="确认密码"
                v-model="formData.confirmPwd"
              />
            </div>
            <div class="submit" @click="onSubmit">{{ submitText }}</div>
            <div
              class="flex justify-between control mt-2"
              v-if="formType === 'login'"
            >
              <span class="forget" @click="onForgetPwd">忘记密码</span>
              <span class="regist" @click="onRegister">立即注册</span>
            </div>
          </div>
        </div>
      </div>
    </van-overlay>
  </div>
</template>

<script>
import { mapGetters } from 'vuex'
import { isMobile } from '@/utils/validator'
export default {
  name: 'simple-login',
  props: {
    type: {
      type: String,
      default: 'login',
    },
  },
  data() {
    return {
      formType: 'login',
      show: false,
      sendStatus: 0,
      formData: {
        authUserId: '',
        mobile: '',
        verifyCode: '',
        password: '',
        confirmPwd: '',
      },
      timer: null,
    }
  },
  computed: {
    ...mapGetters(['loginVisiable', 'authUserId', 'routePrefix']),
    sendCodeBtnText() {
      return this.sendStatus === 0
        ? '发送验证码'
        : `再次发送${this.sendStatus}s`
    },
    submitText() {
      return this.formType === 'login'
        ? '登录'
        : this.formType === 'forget'
        ? '确定'
        : '提交'
    },
  },
  created() {
    this.formType = this.type
  },
  watch: {
    loginVisiable() {
      this.show = this.loginVisiable
    },
    type: {
      handler: function (nval) {
        this.formType = nval
        console.log(nval)
      },
      immediate: true,
    },
  },
  methods: {
    // 忘记密码
    onForgetPwd() {
      this.$emit('click', 'forget')
    },
    // 立即注册
    onRegister() {
      this.$emit('click', 'register')
    },

    async onSubmit() {
      // 验证手机号是否合法
      if (!isMobile(this.formData.mobile)) {
        this.$toast('请输入正确的手机号')
        return
      }

      if (this.formType === 'register') {
        this.onRegisterSubmit()
      } else if (this.formType === 'forget') {
        this.onForgetSubmit()
      } else {
        this.onLoginSubmit()
      }
    },

    // 忘记密码
    async onForgetSubmit() {
      if (!this.formData.verifyCode) {
        this.$toast('请输入验证码')
        return
      }

      if (this.formData.password.length < 6) {
        this.$toast('密码长度需大于6位')
        return
      }

      if (this.formData.password !== this.formData.confirmPwd) {
        this.$toast('两次输入的密码不一致')
        return
      }

      try {
        await this.$http.api.clubUserReset({
          mobile: this.formData.mobile,
          verifyCode: this.formData.verifyCode,
          password: this.formData.password,
          authUserId: this.authUserId,
        })
      } catch (error) {}
    },

    // 用户注册
    async onRegisterSubmit() {
      if (!this.formData.verifyCode) {
        this.$toast('请输入验证码')
        return
      }
      if (this.formData.password.length < 6) {
        this.$toast('密码长度需大于6位')
        return
      }
      if (this.formData.password !== this.formData.confirmPwd) {
        this.$toast('两次输入的密码不一致')
        return
      }

      try {
        await this.$http.api.clubUserRegister({
          mobile: this.formData.mobile,
          verifyCode: this.formData.verifyCode,
          password: this.formData.password,
          authUserId: this.authUserId,
        })
        this.$toast('注册成功，请登录')
        this.$emit('click', 'login')
      } catch (error) {
        console.log(error)
        this.$toast(error.msg)
      }
    },

    // 用户登录
    async onLoginSubmit() {
      if (!this.formData.password) {
        this.$toast('密码不能为空')
        return
      }

      try {
        const res = await this.$http.api.clubUserLogin({
          mobile: this.formData.mobile,
          password: this.formData.password,
          authUserId: this.authUserId,
        })
        this.login(res)
      } catch (error) {
        console.log(error)
        this.$toast(error.msg)
      }
    },

    login(res) {
      this.$store.dispatch('user/login', res.data)
      this.$setStorage(this.routePrefix, 'userInfo', res.data)
      // 关闭登录窗口
      this.onClose()
      // 重定向
      const login_redicret = this.$getStorage(
        this.routePrefix,
        'login_redicret'
      )
      if (login_redicret && login_redicret !== this.$route.path) {
        this.$router.push(login_redicret)
      }
    },

    // 关闭登录窗口
    onClose() {
      this.$store.commit('app/HIDE_LOGIN')
      this.formData.mobile = ''
      this.formData.verifyCode = ''
      this.formData.password = ''
      this.formData.confirmPwd = ''
    },
    async onSend() {
      if (this.sendStatus > 0) return
      // 验证手机号是否合法
      if (!isMobile(this.formData.mobile)) {
        this.$toast('请输入正确的手机号')
        return
      }
      try {
        // 发送验证码
        await this.$http.api.clubUserCodeSend({
          mobile: this.formData.mobile,
          authUserId: this.authUserId,
          type: this.formType === 'register' ? 1 : 2,
        })
        this.$toast('验证码已发送')
        // 开启倒计时
        this.countdown()
      } catch (error) {
        console.log(error)
      }
    },
    countdown() {
      this.sendStatus = 30
      this.timer = setInterval(() => {
        if (this.sendStatus === 0) {
          clearInterval(this.timer)
          return
        }
        this.sendStatus--
      }, 1000)
    },
  },
}
</script>

<style scoped lang="scss">
@media screen and (min-width: 768px) {
  .wrapper {
    height: 100vh;

    .block {
      position: relative;
      width: 400px;
      background: #fff;

      .close {
        position: absolute;
        right: 16px;
        top: 16px;
        width: 24px;
        height: 24px;
        background: url(https://static.caimei365.com/www/authentic/h5/icon-close.png)
          center no-repeat;
        background-size: 24px 24px;
        cursor: pointer;
      }

      .title {
        font-size: 24px;
        color: #101010;
      }

      .form-item {
        position: relative;
        width: 326px;

        input {
          width: 326px;
          display: block;
          padding: 14px 16px;
          font-size: 14px;
          border: 1px solid #d8d8d8;
          box-sizing: border-box;

          &.code {
            width: 225px;
          }
        }
        .send {
          position: absolute;
          right: 0;
          top: 50%;
          transform: translateY(-50%);
          font-size: 16px;
          cursor: pointer;
          @include themify($themes) {
            color: themed('color');
          }
        }
      }

      .control {
        font-size: 14px;

        .forget,
        .regist {
          cursor: pointer;
        }
        .forget {
          color: #666;

          &:hover {
            @include themify($themes) {
              color: themed('color');
            }
          }
        }
        .regist {
          @include themify($themes) {
            color: themed('color');
          }
        }
      }

      .submit {
        width: 326px;
        height: 46px;
        font-size: 16px;
        color: #fff;
        text-align: center;
        line-height: 46px;
        transition: all 0.4s;
        cursor: pointer;

        @include themify($themes) {
          background: themed('color');
        }

        &:hover {
          @include themify($themes) {
            background: themed('hover-color');
          }
        }
      }
    }
  }
}
@media screen and (max-width: 768px) {
  .wrapper {
    height: 100vh;

    .block {
      position: relative;
      width: 76vw;
      background: #fff;

      .close {
        position: absolute;
        right: 2.4vw;
        top: 2.4vw;
        width: 5.6vw;
        height: 5.6vw;
        background: url(https://static.caimei365.com/www/authentic/h5/icon-close.png)
          center no-repeat;
        background-size: 4.8vw 4.8vw;
        cursor: pointer;
      }

      .title {
        font-size: 4.8vw;
        color: #101010;
      }

      .form-item {
        position: relative;
        width: 62vw;

        input {
          width: 62vw;
          display: block;
          padding: 1.8vw 2.4vw;
          font-size: 14px;
          border: 0.1vw solid #d8d8d8;
          box-sizing: border-box;

          &.code {
            width: 42.8vw;
          }
        }
        .send {
          position: absolute;
          right: 0;
          top: 50%;
          transform: translateY(-50%);
          font-size: 3.2vw;
          cursor: pointer;
          @include themify($themes) {
            color: themed('color');
          }
        }
      }

      .control {
        font-size: 3.2vw;

        .forget,
        .regist {
          cursor: pointer;
        }
        .forget {
          color: #666;

          &:hover {
            @include themify($themes) {
              color: themed('color');
            }
          }
        }
        .regist {
          @include themify($themes) {
            color: themed('color');
          }
        }
      }
      .submit {
        width: 62vw;
        height: 8.8vw;
        font-size: 3.2vw;
        color: #fff;
        text-align: center;
        line-height: 8.8vw;
        transition: all 0.4s;

        @include themify($themes) {
          background: themed('color');
        }
      }
    }
  }
}
</style>
