import React, { Component } from "react"
import VList from "src/common/v-list-base"
import "./my-courses.scss"
import { isToday, format } from "date-fns"
import { connect } from "react-redux"
import { fetchCoursesListIfNeeded, switchTab } from "./actions"
import InfiniteScroll from "react-infinite-scroller"
import { debounce } from "lodash"
import { Link } from "react-router-dom"
import { Loading } from "src/common"

function getStudyTime(seconds) {
  return {
    hour: Math.floor(seconds / (60 * 60)),
    min: Math.floor(seconds / 60) % 60,
    sec: seconds % 60,
  }
}

const AddCourse = React.memo(({ addCourseClick }) => (
  <div className="add-course">
    <button className="add" onClick={addCourseClick}>
      添加课程+
    </button>
  </div>
))

function Record({ record: { seconds, lesson_name } }) {
  let re = /第[\s\S]+?课/,
    result = ""

  if (lesson_name) {
    let matchResult = re.exec(lesson_name)
    result += matchResult && matchResult[0] ? matchResult[0] : ""
  }

  if (seconds) {
    let studyTime = getStudyTime(seconds)
    let hour = studyTime.hour
        ? String(studyTime.hour).padStart(2, "0") + "时"
        : "",
      min = studyTime.min ? String(studyTime.min).padStart(2, "0") + "分" : "",
      sec = studyTime.sec ? String(studyTime.sec).padStart(2, "0") + "秒" : ""

    result += hour + min + sec
  }

  return (
    <span className={"record"}>{result.length ? `学习到${result}` : null}</span>
  )
}

const Bottom = React.memo(({ item }) => {
  if (item.ago || item.seconds) {
    let date = new Date(item.ago * 1000)
    let time = isToday(date)
      ? format(date, "HH时mm分")
      : format(date, "MM月dd日")
    return (
      <div className="des">
        <span className="time">{time}</span>
        <Record record={item} />
      </div>
    )
  }
  return <button className="start-learn">开始学习</button>
})

class MyCourses extends Component {
  list

  state = {
    isLoading: true,
  }

  handleClick = (id, item) => {
    const { history } = this.props
    const { mode, course_id } = item
    if (mode && Number(mode) === 6) {
      history.push(`/python?id=${course_id}`)
      return
    }
    history.push(`/play/video?id=${id}`)
  }
  addCourseClick = () => {
    this.props.history.push("/classify")
  }

  componentDidMount() {
    this.props.switchTab(false)
    this.props.fetchCoursesListIfNeeded()
  }

  componentWillUnmount() {
    this.props.switchTab(true)
  }

  loadFunc = debounce(() => {
    if (this.props.courseList.length % 10 === 0) {
      this.props.fetchCoursesListIfNeeded()
    }
  }, 200)

  render() {
    let { courseList, user } = this.props

    return (
      <Loading isLoading={this.props.isLoading}>
        {courseList && courseList.length !== 0 ? (
          <>
            <div className="my-course-uid">
              {`加群请备注您的学号：${
                !user.hasError && this.props.user.data.uid
              }`}
            </div>
            <InfiniteScroll
              pageStart={0}
              hasMore={true}
              loadMore={this.loadFunc}
              useWindow={false}
            >
              <ul ref={(el) => (this.list = el)}>
                {courseList.map((item, index) => {
                  const Info = (
                    <div className="info">
                      <div className="title">{item.course_title}</div>
                      {!item.is_restricted && item.is_aist && (
                        <div className="contact">
                          助教微信：{item.assist_weixin}
                        </div>
                      )}
                      {!item.is_restricted &&
                        !item.is_aist &&
                        Number(item.contact_type) === 1 &&
                        item.course_qq && (
                          <div className="contact">QQ群：{item.course_qq}</div>
                        )}
                      {!item.is_restricted &&
                        !item.is_aist &&
                        Number(item.contact_type) === 2 &&
                        item.course_qq && (
                          <div className="contact">
                            班主任微信：{item.course_qq}
                          </div>
                        )}

                      {item.is_aist && item.aist_schedule && (
                        <div className="process-status">
                          <div className="process-wrapper">
                            <div
                              className="process-bar"
                              style={{
                                width: `${parseFloat(item.aist_schedule)}%`,
                              }}
                            />
                          </div>
                          <div className="process-text">
                            {item.aist_schedule}
                          </div>
                        </div>
                      )}
                      <Bottom item={item} />
                    </div>
                  )

                  const status = item.is_aist ? (
                    <span className="status">返现</span>
                  ) : item.course_expire ? (
                    <span className="course-expire">{item.course_expire}</span>
                  ) : null
                  return (
                    <VList
                      img={item.image_name}
                      handleClick={this.handleClick}
                      {...item}
                      key={index}
                      info={Info}
                      status={status}
                      item={item}
                      id={item["v_course_id"]}
                    />
                  )
                })}
              </ul>
            </InfiniteScroll>
            {courseList.length % 10 !== 0 ? (
              <AddCourse addCourseClick={this.addCourseClick} />
            ) : null}
          </>
        ) : (
          <div className="empty">
            <p>
              <i className="iconfont iconfish" />
            </p>
            <p className="empty-prompt">您还没有课程哦，赶快去选课吧~</p>
            <p>
              <Link className="select-course" to="/classify">
                去选课
              </Link>
            </p>
          </div>
        )}
      </Loading>
    )
  }
}

export default connect(
  (state) => ({
    courseList: state.myCourses.courseList,
    user: state.user,
    isLoading: state.myCourses.isLoading,
  }),
  {
    fetchCoursesListIfNeeded,
    switchTab,
  }
)(MyCourses)
