<template>
  <view>
    <view class="tips">
      <!-- #ifdef MP-WEIXIN -->
      {{
        type === 'email'
          ? '在APP上找回密码和登录新设备时，可通过绑定的邮箱验证'
          : '在APP上找回密码和登录新设备时，可通过绑定的手机号验证'
      }}
      <!-- #endif -->
      <!-- #ifdef APP-PLUS -->
      {{
        type === 'email'
          ? '找回密码和登录新设备时，可通过绑定的邮箱验证'
          : '找回密码和登录新设备时，可通过绑定的手机号验证'
      }}
      <!-- #endif -->
    </view>
    <view class="view-country" v-if="type === 'mobile'" @click="toJump('countryList')">
      <view>国家/地区</view>
      <view class="text-#63b8af">{{ country.name }} +{{ country.code }}</view>
    </view>
    <input
      :type="type === 'email' ? 'text' : 'number'"
      class="input-account"
      :value="email"
      :placeholder="type === 'email' ? '请输入邮箱' : '请输入手机号'"
      placeholder-class="input-placeholder"
      :focus="true"
      @input="updateInputEmail"
    />
    <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="getEmailCode">{{ text }}</view>
    </view>
    <view class="button" @click="toUpdateEmail">确定</view>
  </view>
</template>

<script>
  import { mapActions, mapState } from 'pinia'
  import { useUserStore } from '@/stores/user'
  import { getEmailCodeRequest, updateEmailRequest, updatePhoneRequest } from '@/api/user'
  import { useBasicStore } from '@/stores/basic'
  import { PHONE_REG, EMAIL_REG } from '@/constant/reg'

  export default {
    data() {
      return {
        text: '获取验证码',
        verificationCode: '',
        token: '',
        email: '',
        pending: false,
        type: '',
        country: {
          name: '中国',
          code: '86'
        }
      }
    },
    computed: {
      ...mapState(useUserStore, ['userInfo']),
      isAccountValid() {
        if (!this.email) {
          return false
        }
        if (this.type === 'email') {
          return EMAIL_REG.test(this.email)
        }
        if (this.type === 'mobile') {
          return PHONE_REG.test(this.email)
        }
        return false
      }
    },
    onLoad(option) {
      this.type = option.type
      uni.setNavigationBarTitle({
        title: this.type === 'email' ? '验证邮箱' : '验证手机号'
      })
      if (option.token) {
        this.token = option.token
      } else {
        uni.setNavigationBarTitle({
          title: this.type === 'email' ? '绑定邮箱' : '绑定手机号'
        })
      }
    },
    methods: {
      ...mapActions(useUserStore, ['updateUserInfo']),
      ...mapActions(useBasicStore, ['routeJump', 'backAndToast', 'getNetworkType']),
      toJump(path) {
        this.routeJump({
          name: path,
          events: {
            country: data => {
              this.country = data
            }
          }
        })
      },
      updateInputEmail(data) {
        this.email = data.detail.value
      },
      updateInputCode(data) {
        this.verificationCode = data.detail.value
      },
      async getEmailCode() {
        if (this.text !== '获取验证码') {
          return
        }
        if (!this.isAccountValid) {
          uni.showToast({
            title: this.type === 'email' ? '请输入正确的邮箱' : '请输入正确的手机号',
            icon: 'none'
          })
          return
        }
        const netWork = await this.getNetworkType()
        if (!netWork) {
          return
        }
        const { code, message } = await getEmailCodeRequest({
          account: this.email,
          channel: this.type === 'email' ? '2' : '1',
          codeType: this.type === 'email' ? 6 : 3,
          countryCode: this.type === 'mobile' ? this.country.code : undefined
        })
        if (code === 0) {
          this.updateTime()
        } else {
          uni.showToast({
            title: message,
            icon: 'none'
          })
        }
      },
      async toUpdateEmail() {
        if (!this.isAccountValid) {
          uni.showToast({
            title: this.type === 'email' ? '请输入正确的邮箱' : '请输入正确的手机号',
            icon: 'none'
          })
          return
        }
        if (/^\d{6}$/.test(this.verificationCode)) {
          const netWork = await this.getNetworkType()
          if (!netWork) {
            return
          }
          if (this.pending) {
            return
          }
          this.pending = true
          const params = {
            verificationCode: this.verificationCode
          }
          if (this.type === 'email') {
            params.email = this.email
          } else {
            params.account = this.email
            params.countryCode = this.country.code
          }
          if (this.token !== '') {
            params.unbindToken = this.token
          }
          const request = this.type === 'email' ? updateEmailRequest : updatePhoneRequest
          const { code, message } = await request(params)
          if (code === 0) {
            this.updateUserInfo({
              ...this.userInfo,
              [this.type]: this.email
            })
            this.backAndToast(this.type === 'email' ? '邮箱绑定成功' : '手机号绑定成功')
          } else {
            uni.showToast({
              title: message,
              icon: 'none'
            })
          }
          this.pending = false
        } else {
          uni.showToast({
            title: '验证码为6位纯数字',
            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)
      }
    }
  }
</script>

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

<style scoped lang="scss">
  .tips {
    padding: 24rpx 32rpx 0 32rpx;
    font-size: 28rpx;
    color: #999999;
  }

  .view-country {
    display: flex;
    justify-content: space-between;
    width: 616rpx;
    height: 108rpx;
    padding-right: 32rpx;
    padding-left: 32rpx;
    margin-top: 48rpx;
    margin-left: 35rpx;
    font-size: 28rpx;
    line-height: 108rpx;
    background: #ffffff;
    border-radius: 16rpx;
  }

  .input-account {
    width: 616rpx;
    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: #4777ee;
    border-radius: 16rpx;
  }

  .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;
  }

  .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: #4777ee;
    border-radius: 16rpx;
  }
</style>
