<template>
  <view>
    <input
      class="input"
      :password="true"
      :value="password"
      maxlength="20"
      placeholder="请输入新密码"
      placeholder-class="input-placeholder"
      @input="updateNewPassword"
    />
    <view class="view-top">
      <input
        type="number"
        class="input-verify"
        :value="verificationCode"
        maxlength="6"
        placeholder="请输入验证码"
        placeholder-class="input-placeholder"
        @input="updateInputCode"
      />
      <view class="button-verify" @click="getPhoneCode">{{ text }}</view>
    </view>
    <view class="text-tips">密码必须是8-20位，至少包括数字/字母/符号中的2种</view>
    <view class="button" @click="updatePassword">保存</view>
  </view>
</template>

<script>
  import { mapActions, mapState } from 'pinia'
  import { test } from 'uview-plus'
  import { useUserStore } from '@/stores/user'
  import { changePasswordRequest, getEmailCodeRequest } from '@/api/user'
  import { useBasicStore } from '@/stores/basic'

  export default {
    data() {
      return {
        text: '获取验证码',
        password: '',
        pending: false,
        verificationCode: ''
      }
    },
    computed: {
      ...mapState(useUserStore, ['userInfo'])
    },
    methods: {
      ...mapActions(useUserStore, ['updateUserInfo']),
      ...mapActions(useBasicStore, ['backAndToast', 'getNetworkType']),
      updateNewPassword(data) {
        this.password = data.detail.value
      },
      updateInputCode(data) {
        this.verificationCode = data.detail.value
      },
      async getPhoneCode() {
        if (this.text !== '获取验证码') {
          return
        }
        const netWork = await this.getNetworkType()
        if (!netWork) {
          return
        }
        const { code, message } = await getEmailCodeRequest({
          channel: '1',
          codeType: 9
        })
        if (code === 0) {
          this.updateTime()
        } else {
          uni.showToast({
            title: message,
            icon: 'none'
          })
        }
      },
      updateTime() {
        let time = 120
        this.text = `${time} s`
        const now = new Date().getTime()
        const timer = setInterval(() => {
          const second = parseInt((new Date().getTime() - now) / 1000, 10)
          this.text = `${time - second} s`
          if (time <= second) {
            clearInterval(timer)
            this.text = '获取验证码'
          }
        }, 1000)
      },
      async updatePassword() {
        if (this.password === '') {
          uni.showToast({
            title: '密码不能为空',
            icon: 'none'
          })
          return
        }
        if (this.password.length < 8 || this.password.length > 20) {
          uni.showToast({
            title: '密码长度必须是8-20位',
            icon: 'none'
          })
          return
        }
        if (!(this.verificationCode.length === 6 && test.digits(this.verificationCode))) {
          uni.showToast({
            title: '验证码为6位纯数字',
            icon: 'none'
          })
          return
        }
        const netWork = await this.getNetworkType()
        if (!netWork) {
          return
        }
        if (this.pending) {
          return
        }
        this.pending = true
        const { code, message } = await changePasswordRequest({
          verificationCode: this.verificationCode,
          password: this.password,
          channel: '1'
        })
        if (code === 0) {
          this.backAndToast('密码重置成功')
        } else {
          uni.showToast({
            title: message,
            icon: 'none'
          })
        }
        this.pending = false
      }
    }
  }
</script>

<style lang="scss">
  page {
    background-color: $uni-bg-color-grey;
  }
</style>

<style scoped lang="scss">
  .input {
    width: 616rpx;
    height: 108rpx;
    padding-right: 32rpx;
    padding-left: 32rpx;
    margin-top: 48rpx;
    margin-left: 35rpx;
    background: #ffffff;
    border-radius: 16rpx;
  }

  .input-placeholder {
    height: 108rpx;
    font-size: 36rpx;
    font-weight: bold;
    line-height: 108rpx;
  }

  .button {
    width: 680rpx;
    height: 96rpx;
    margin-top: 32rpx;
    margin-left: 35rpx;
    font-size: 32rpx;
    line-height: 96rpx;
    color: #ffffff;
    text-align: center;
    background: #63b8af;
    border-radius: 16rpx;
  }

  .text-tips {
    margin-top: 32rpx;
    font-size: 28rpx;
    color: #9b9b9b;
    text-align: center;
  }

  .view-top {
    display: flex;
    align-items: center;
  }

  .input-verify {
    width: 316rpx;
    height: 108rpx;
    padding-right: 32rpx;
    padding-left: 32rpx;
    margin-top: 48rpx;
    margin-left: 35rpx;
    background: #ffffff;
    border-radius: 16rpx;
  }

  .button-verify {
    width: 265rpx;
    height: 108rpx;
    margin-top: 48rpx;
    margin-left: 35rpx;
    font-size: 32rpx;
    line-height: 108rpx;
    color: #ffffff;
    text-align: center;
    background: #63b8af;
    border-radius: 16rpx;
  }
</style>
