import React, { Component } from 'react';
import { Formik, Form, Field } from 'formik';
import { Toast } from 'antd-mobile';
import { isEmpty } from 'lodash';
import CaptchaAli from "@common/Captcha-ali"
import { http } from '@/utils';
import './index.scss';

class BindPhone extends Component {
  captchaInstance = null;

  constructor(props) {
    super(props),
      this.state = {
        validate: '',
        seconds: 60,
        isFirst: true,
        timer: null,
        isTimer: false, // 是否开始倒计时
        accountInfo: {},
        bindInfo: {},
        country: {
          num: '86'
        },
        validationData: null
      }
  }

  componentDidMount() {
    this.initCountryInfo();
  }

  initCountryInfo = () => {
    const {country} = this.props;
    this.setState({
      country
    });
  }

  toFetchCountryNum = () => {
    const {history, hideBindPhone} = this.props;
    hideBindPhone();
    history.push('/country?from=bind');
  }

  getCaptchaInstance = instance => {
    this.captchaInstance = instance;
  }

  onVerify = (data) => {
    this.setState({
      validate: true,
      validationData: data
    })
  }

  // 获取手机号验证码
  handleToSend = ({tel, code}) => {
    let {validate, seconds, validationData, isFirst, isTimer, country: {num = '86'}} = this.state;
    if (validate) {
      if (!isFirst) {
        Toast.info('请重新进行滑块验证', 2, null, false);
        this.captchaInstance.reset();
        this.setState({
          isFirst: true
        });
        return
      }
      if (!isTimer) {
        if (!tel) {
          Toast.info('手机号码不能为空', 2, null, false);
        } else if (!/^\d+$/.test(tel)) {
          Toast.info('请输入正确格式的手机号码', 2, null, false);
        } else {

          // 获取验证码
          http.post(
            `${API['passport-api']}/m/personal/bindPhoneSendCode`,
            {
              area_code: `00${num}`,
              phone_num: tel,
              ...validationData
            }
          ).then(res => {
            const {errno, msg} = res.data;
            if (errno === 200) {
              Toast.info('验证码发送成功', 2, null, false);

              // 倒计时
              this.timer = window.setInterval(() => {
                if (seconds <= 0) {
                  window.clearInterval(this.timer);
                  this.setState({
                    isTimer: false,
                    seconds: 60
                  });
                } else {
                  this.setState({
                    isTimer: true,
                    seconds: --seconds
                  });
                }
              }, 1000);

              // 滑块
              this.setState({
                isFirst: false
              })
            } else {
              Toast.info(msg, 2, null, false);
            }
          })
        }
      }
    }
    return false;
  }

  // 绑定手机
  toBindPhone = () => {
    const {accountInfo: {tel, code}, country: {num = '86'}} = this.state;
    const {handleToConfirmPhone, successBindPhone} = this.props;
    const params = {
      area_code: `00${num}`,
      mobile: tel,
      code: code,
      act_type: 'treasure', // 宝箱
    };
    http.post(
      `${API.home}/sys/v2/user/bindMobile`,
      {
        ...params,
        type: 1, // 1:绑定,2:修改绑定
        is_valid: 1, // is_valid	是否验证 1:验证(默认),0不验证
      }
    ).then(res => {
      const {code, data, msg} = res.data;
      if (code === 200) {
        if (data.tip_info) {
          handleToConfirmPhone(params, data.tip_info);
        } else {
          successBindPhone();
        }
      } else {
        Toast.info(msg, 2, null, false);
      }
    });
  }

  render() {
    const {desc, skip = 'year'} = this.props;
    const {country, validate, isTimer, seconds} = this.state;
    return (
      <Formik
        initialValues={{
          tel: '',
          code: ''
        }}
        validate={({tel, code}) => {
          const errors = {};

          // if (!validateTel(tel)) {
          if (!/^\d+$/.test(tel)) {
            errors.tel = '请填写正确格式的手机号';
          }
          if (!/[0-9]{6}/.test(code)) {
            errors.code = '请输入验证码';
          }

          return errors;
        }}
        onSubmit={(values, {setStatus, setSubmitting}) => {
          this.setState({
            accountInfo: {
              ...values
            }
          });
          this.toBindPhone();
        }}
        render={({values: {tel, code}, errors}) => (
          <Form className="popup-form" data-skip={skip}>
            <h2 className="popup-form__title">绑定手机号</h2>
            {
              desc &&
              <div className="poup-form__desc">{desc}</div>
            }
            <div className="popup-form__item">
              <a className="popup-form__button--num" onClick={this.toFetchCountryNum}>
                +{country.num}
                <i className="iconfont iconiconfront-69"/>
              </a>
              <Field
                name="tel"
                render={({field}) => {
                  return (
                    <input
                      {...field}
                      className="popup-form__ipt"
                      data-type="tel"
                      type="text"
                      placeholder="请填写手机号"
                    />
                  );
                }}
              />
            </div>
            <CaptchaAli getInstance={this.getCaptchaInstance} onVerify={this.onVerify} mb={15}/>
            <div className="popup-form__item">
              <Field
                name="code"
                render={({field}) => {
                  return (
                    <input
                      {...field}
                      className="popup-form__ipt popup-form__ipt--left"
                      type="text"
                      placeholder="输入验证码"
                    />
                  );
                }}
              />
              <button
                className="popup-form__button--code"
                data-status={(validate && !isTimer) ? 'do' : ''}
                type="button"
                onClick={() => this.handleToSend({tel, code})}
              >
                {
                  isTimer ? `重新发送${seconds}s` : '发送验证码'
                }
              </button>
            </div>
            <button
              className="popup-form__button--bundle"
              data-status={(tel && code && isEmpty(errors)) ? 'do' : 'done'}
              type="submit"
            >
              完成绑定
            </button>
          </Form>
        )}
      />
    )
  }
}

export default BindPhone;