import React, { Component } from 'react'
import { HeaderBar } from '@/common'
import { http } from '@/utils'
import './index.scss'
import QRCode from 'qrcode'
import html2canvas from 'html2canvas'
import scoreIconL from '@assets/image/score_icon-l.png'
import scoreIconR from '@assets/image/score_icon-r.png'
import scoreReportBg from '@assets/image/scoreReport_bg.png'
import { connect } from "react-redux"

@connect(state => ({
    user: state.user,
  }),
)
class scoreReport extends Component {

  constructor(props) {
    super(props)
    this.state = {
      tab: ['当前成绩', '今日最佳', '本月最佳'],
      cutIndex: 0,
      myRankList: '',
      imgUrl: '',
      codeSrc: '',
      avatar_file: '',
    }
  }

  componentDidMount() {
    window.onbeforeunload = () => {
      document.documentElement.scrollTop = 0
      document.body.scrollTop = 0
    }
    this.getCodeWe()
    this.handleFetchInfo(0)
  }


  shouldComponentUpdate(nextProps, nextState, nextContext) {
    if (this.props.user.data.avatar !== nextProps.user.data.avatar) {
      this.getCanvas()
      return false
    }
    return true
  }


  getCanvas() {
    document.documentElement.scrollTop = 0
    document.body.scrollTop = 0

    let _this = this
    var canvas2 = document.createElement("canvas")
    let _canvas = document.getElementsByClassName('score-list')[0]
    if (!_canvas) {
      return
    }
    var w = parseInt(window.getComputedStyle(_canvas).width)
    var h = parseInt(window.getComputedStyle(_canvas).height)
    var scale = window.devicePixelRatio
    canvas2.width = w * scale
    canvas2.height = h * scale

    var context = canvas2.getContext("2d")
    context.scale(1, 1)
    html2canvas(document.getElementsByClassName('score-list')[0], {canvas: canvas2}).then(function (canvas) {
      //document.body.appendChild(canvas);

      let imgUrl = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream")
      _this.setState({
        imgUrl: imgUrl,
      })
    })
  }

// 获取二维码
  getCodeWe() {
    let _this = this
    let qrCodeLink = `${API.m}/ai-test`
    return new Promise(resolve => {
      QRCode.toDataURL(qrCodeLink, {}, function (err, url) {
        _this.setState({
          codeSrc: url,
        })
      })
      resolve()
    })
  }

  handleFetchInfo = (index) => {
    http.get(`${API.home}/sys/at/user_score/${index}`).then(res => {
      const {code, data} = res.data
      if (code === 200) {
        this.setState({
          myRankList: data,
        })

        let avatar = this.props.user && this.props.user.data.avatar
        this.getBase64(avatar)
        setTimeout(() => {
          this.getCanvas()
        }, 500)
      } else if (code === 4030) {
        const {user, history} = this.props
        if (user.hasError) {
          history.push('/passport')
        }
      }
    })
  }


  getBase64Image = (img) => {
    var canvas = document.createElement("canvas")
    canvas.width = img.width
    canvas.height = img.height

    var ctx = canvas.getContext("2d")
    ctx.drawImage(img, 0, 0, img.width, img.height)
    var ext = img.src.substring(img.src.lastIndexOf(".") + 1).toLowerCase()
    var dataURL = canvas.toDataURL("image/" + ext)
    return dataURL
  }

  getBase64 = (img) => {
    let base64 = null
    let image = new Image()
    let timeStamp = +new Date()
    image.setAttribute('crossOrigin', 'anonymous')
    image.src = img + '?' + timeStamp
    image.onload = () => {
      base64 = this.getBase64Image(image)
      this.setState({
        avatar_file: base64,
      })
    }
    image.onerror = () => {
      console.log('onerror')
      let timeStamp = +new Date()
      this.getBase64(img + '?' + timeStamp)
    }
  }


  change = (index) => {
    this.setState({
      cutIndex: index,
    })
    this.handleFetchInfo(index)
  }


  render() {
    const {tab, cutIndex, myRankList, codeSrc, imgUrl, avatar_file} = this.state
    return (
      <div className={'score-content'}>
        <HeaderBar
          title='成绩报告'
          arrow={true}
          home={false}
        />
        <div className={'score-report'}>
          <ul className={'tab-list'}>
            {
              tab.map((item, index) => {
                return (
                  <li key={index} className={cutIndex === index ? 'active' : ''}
                      onClick={() => this.change(index)}>{item}</li>
                )
              })
            }
          </ul>

          <div className="score-list-box">

            <div className={'score-list'} style={{backgroundImage: `url(${scoreReportBg})`}}>
              <div className="title">
                <img src={scoreIconL} alt=""/>
                成绩报告
                <img src={scoreIconR} alt=""/>
              </div>

              <table border="0" cellSpacing="0" cellPadding="0">
                <thead>
                <tr>
                  <td>分数</td>
                  <td>用时</td>
                  <td>{cutIndex === 0 && '最终'}排名</td>
                </tr>
                </thead>
                <tbody>
                {
                  myRankList.r_id !== 0 &&
                  <tr className={'has'}>
                    <td>{myRankList.score}分</td>
                    <td>{myRankList.cost_time}</td>
                    <td className={'rank'}>{myRankList.rank}</td>
                  </tr>
                }
                {
                  myRankList.r_id == 0 &&
                  <tr>
                    <td>-</td>
                    <td>-</td>
                    <td>-</td>
                  </tr>
                }

                </tbody>
              </table>

              <div className="comment text-overflow-4">
                <img className={'avatar_file'} src={avatar_file} alt=""/>
                {myRankList && myRankList.title && myRankList.title.comment}
              </div>

              <div className="code">
                <img src={codeSrc} alt=""/>
                <p>AI水平测试</p>
              </div>
            </div>


            <img className={'imgUrl'} src={imgUrl} alt=""/>
          </div>

          <div className="tip">长按图片分享给好友，或保存后分享到朋友圈</div>

        </div>
      </div>
    )
  }
}


export default scoreReport