import React, { Component } from "react"
import "./veri-code-input.scss"
import { http, validateEmail } from "src/utils"
import { Toast } from "antd-mobile"
import { has, isEmpty } from "lodash"

import classnames from "classnames"

import Input from "../Input"

class VeriCodeInput extends Component {
  count = 60
  state = {
    counting: false,
    count: this.count,
    isFirst: true,
  }
  timer = null

  countDown = () => {
    let { count } = this.state
    if (!this.state.isFirst) {
      Toast.info("请重新进行滑块验证", 2, null, false)
      this.props.instance.reset()
      this.setState({
        isFirst: true,
      })
      return
    }

    if (!this.state.counting) {
      if (!this.sendCode()) {
        return
      }
      this.setState({ count: count--, counting: true })
      this.timer = setInterval(() => {
        if (count <= 0) {
          clearInterval(this.timer)
          this.setState({ counting: false, count: this.count })
          return
        }
        this.setState({ count: count-- })
      }, 1000)
    }
  }

  getType = () => {
    const { email } = this.props
    if (validateEmail(email)) {
      return "email"
    }
  }

  sendCode = () => {
    if (!this.validate()) return
    this.getType() === "email" ? this.sendEmail() : this.sendSMS()
    return true
  }

  sendEmail = () => {
    const { email, validationData } = this.props
    http
      .post(`${API["passport-api"]}/send_email_code`, {
        email,
        ...validationData,
      })
      .then((res) => {
        if (res.data.errno === 0) {
          Toast.info("验证码发送成功", 2, null, false)
        } else {
          Toast.info(res.data.msg, 2, null, false)
        }
        this.setState({
          isFirst: false,
        })
      })
  }

  sendSMS = () => {
    const {
      action,
      tel,
      account,
      validationData,
      checking,
      country,
    } = this.props
    if (!tel) {
      Toast.info("请输入手机号")
      return
    }
    http
      .post(`${API["passport-api"]}/quick_sms`, {
        phone_num: tel || account,
        action: action || "login",
        area_code: "00" + country.num,
        checking,
        ...validationData,
      })
      .then((res) => {
        if (res.data.errno === 0) {
          Toast.info("验证码发送成功", 2, null, false)
        } else {
          Toast.info(res.data.msg, 2, null, false)
        }
        this.setState({
          isFirst: false,
        })
      })
  }

  validate = () => {
    const { tel, validationData, email } = this.props
    let hasTel = has(this.props, "tel")
    let content

    if (hasTel) {
      if (!tel) {
        content = "手机号码不能为空"
      }
      if (!/\d/.test(tel)) {
        content = "请输入正确格式的手机号码"
      }
    } else {
      if (!email) {
        content = "电子邮件不能为空"
      }
      if (!validateEmail(email)) {
        content = "请输入正确格式的电子邮件"
      }
    }

    if (content) {
      Toast.info(content, 2, null, false)
      return false
    }

    if (isEmpty(validationData)) {
      Toast.info("请进行滑块验证", 2, null, false)
      return false
    }
    return true
  }

  render() {
    let { className, validationData, ...rest } = this.props
    return (
      <Input type={"number"} wrapperClass={className} {...rest}>
        <button
          type="button"
          className={classnames("verify", { active: !this.state.counting })}
          onClick={this.countDown}
        >
          {this.state.counting ? `重新发送${this.state.count}s` : "发送验证码"}
        </button>
      </Input>
    )
  }
}

export default VeriCodeInput