/* eslint-disable no-sequences, eqeqeq, jsx-a11y/anchor-is-valid */
import React, { PureComponent } from "react"
import "./index.scss"
import RedeemBar from "../RedeemBar"
import Coupon from "../Coupon"
import { http, getParam } from "src/utils"
import { WithFullSize } from "src/HOCs"
import { Toast } from "antd-mobile"
import { connect } from "react-redux"

@connect()
class UseCoupon extends PureComponent {
  state = {
    selectedCouponId: 0,
    redeemCode: "",
    couponList: [],
    valid_coupons: [],
    invalid_coupons: [],
    courseId: getParam("id"),
    showUseButton: false,
    courseCouponExchange: false, // 课程券兑换弹窗
    courseCouponData: "", // 兑换课程信息
  }

  componentDidMount() {
    const { history, location } = this.props

    const { state } = this.props.location
    if (state && state.from) {
      if (state.from === "/my") {
        this.getMyCoupons()
        this.setState({
          showUseButton: true,
        })
      } else {
        if (!this.state.courseId) {
          location.state && location.state.from
            ? history.replace(location.state.from)
            : history.goBack()
        }
        this.getAllCoupons()
      }
    }
  }

  handleChange = (e) => {
    let value = e ? e.target.value : ""
    this.setState({ redeemCode: value })
  }

  // 兑换
  exchange = () => {
    const {
      location: { state = {} },
    } = this.props
    if (this.state.redeemCode !== "") {
      http
        .post(`${API.home}/m/coupon/exchange`, {
          code: this.state.redeemCode,
          type: state.from.substr(1),
        })
        .then((res) => {
          const data = res.data
          if (data.code === 200) {
            // 如果从我的页面进来，点击兑换直接兑换成功课程，弹出弹窗
            // 如果从订单页面进来，点击兑换兑换成券
            const coupon = data.data

            if (state.from === "/my") {
              if (Number(coupon["ctype"]) === 2) {
                this.setState({
                  courseCouponData: coupon,
                  courseCouponExchange: true,
                  redeemCode: "",
                })
              } else {
                this.setState({
                  couponList: [...this.state.couponList, coupon],
                  redeemCode: "",
                })
                Toast.info("兑换成功")
                this.getMyCoupons()
              }
            }
            if (state.from === "/order") {
              /*const coupon = data.data

              if (coupon['ctype'] == 2
                && coupon['limit_course'] != this.state.courseId) {
                this.setState({
                  invalid_coupons: [...this.state.invalid_coupons, coupon],
                  showUseButton: null,
                  redeemCode: ''
                })
              } else {
                this.setState({
                  valid_coupons: [...this.state.valid_coupons, coupon],
                  redeemCode: ''
                })
              }*/
              Toast.info("兑换成功")
              this.getAllCoupons()
            }
          } else {
            Toast.info(data.msg)
          }
        })
    } else {
      Toast.info("请输入兑换码")
    }
  }

  getMyCoupons = () => {
    Promise.all([
      http.get(`${API.home}/m/coupon/expansion`),
      http.get(`${API.home}/m/coupon/all`),
    ]).then((coupons) => {
      let myCoupons = []
      const [expansionCoupons, allCoupons] = coupons
      const { data: all } = allCoupons
      const { data: expansion } = expansionCoupons
      if (expansion.code === 200) {
        Array.isArray(expansion.data) &&
          (expansion.data = expansion.data.map(
            /* eslint-disable-next-line no-sequences */
            (item) => ((item.ctype = 4), item)
          )) &&
          (myCoupons = myCoupons.concat(expansion.data))
      } else {
        Toast.info(expansion.msg)
      }
      if (all.code === 200) {
        Array.isArray(all.data) && (myCoupons = myCoupons.concat(all.data))
      } else {
        Toast.info(all.msg)
      }

      this.setState({
        couponList: myCoupons,
      })
    })
  }

  getAllCoupons = () => {
    Promise.all([
      http.get(`${API.home}/m/coupon/expansion`),
      http.post(`${API.home}/m/coupon/select`, {
        course_id: this.state.courseId,
      }),
    ]).then((coupons) => {
      const [expansionCoupons, selectCoupons] = coupons
      const { data: select } = selectCoupons
      const { data: expansion } = expansionCoupons
      let PzCoupon = Array.isArray(expansion.data) ? expansion.data : []
      if (expansion.code === 200) {
        Array.isArray(expansion.data) &&
          (expansion.data = expansion.data.map(
            (item) => ((item.ctype = 4), item)
          )) &&
          this.setState({
            valid_coupons: this.state.valid_coupons.concat(expansion.data),
          })
      } else {
        Toast.info(expansion.msg)
      }
      if (select.code === 200) {
        const inuse_coupon = select.data["inuse_coupon"]
        let PzCoupon2 = inuse_coupon
          ? [...inuse_coupon, ...select.data.valid_coupons]
          : select.data.valid_coupons
        this.setState({
          valid_coupons: PzCoupon.concat(PzCoupon2),
          invalid_coupons: select.data.invalid_coupons,
          selectedCouponId: inuse_coupon.length ? inuse_coupon[0].id : 0,
        })
      } else {
        Toast.info(select.msg)
      }
    })
  }

  // 立即兑换课程
  toExchangeCourse = (e, code) => {
    e.stopPropagation()
    http.post(`${API["base-api"]}/pay/miandan/${code}`, {}).then((res) => {
      const data = res.data
      if (data.errno === 200) {
        this.setState({
          courseCouponExchange: true,
          courseCouponData: res.data.data,
        })
        this.getMyCoupons()
      } else {
        Toast.info(data.msg)
      }
    })
  }

  useCoupon = (val) => {
    const { history } = this.props
    const coupon = this.state.couponList.find((item) => item.id === val)

    if (val) {
      if (this.state.showUseButton) {
        if (coupon["limit_course"] === 0) {
          history.push(`/classify`)
        } else {
          history.push(`/detail?id=${coupon["limit_course"]}`)
          return false
        }
      } else {
        const { courseId, selectedCouponId } = this.state

        if (selectedCouponId === val) {
          http
            .post(`${API.home}/m/coupon/cancel`, {
              course_id: courseId,
            })
            .then((res) => {
              const data = res.data
              if (data.code === 200) {
                this.setState({
                  selectedCouponId: 0,
                })
              } else {
                Toast.info(data.msg)
              }
            })
        } else {
          http
            .post(`${API.home}/m/coupon/use`, {
              course_id: this.state.courseId,
              coupon_id: val,
            })
            .then((res) => {
              const data = res && res.data
              if (data.code === 200) {
                this.setState({ selectedCouponId: val })
                this.props.history.goBack()
              } else {
                Toast.info(data.msg)
              }
            })
        }
      }
    } else {
      Toast.info("未知错误")
      window.location.reload()
    }
  }

  // 开始学习
  toStudy = (vCourseId, isHaveVideo) => {
    const { history } = this.props
    if (isHaveVideo == 0) {
      Toast.info("尚未开课，开课后立即上传课程～", 2)
    } else {
      history.push(`/play/video?id=${vCourseId}`)
    }
    this.setState({
      courseCouponExchange: false,
    })
  }

  // 关闭弹窗
  closeFreeCourse = () => {
    this.setState({
      courseCouponExchange: false,
    })
  }

  endExpansion = (id, validId) => {
    this.setState({
      valid_coupons: this.state.valid_coupons.map((item) => {
        if (item.id === id) {
          delete item.start_amount
          item.id = validId
        }
        return item
      }),
    })
  }

  render() {
    const { state } = this.props.location
    const { showUseButton, selectedCouponId } = this.state
    return (
      <div className="use-coupon">
        <RedeemBar
          onChange={this.handleChange}
          exchange={this.exchange}
          redeemCode={this.state.redeemCode}
        />
        <div className="coupons-area">
          <Content
            coupons={
              state && state.from && state.from === "/my"
                ? this.state.couponList
                : this.state.valid_coupons
            }
            showUseButton={showUseButton}
            selectedCouponId={selectedCouponId}
            select={this.select}
            useCoupon={this.useCoupon}
            toExchangeCourse={this.toExchangeCourse}
            endExpansion={this.endExpansion}
          />
          {this.state.invalid_coupons.length > 0 && (
            <>
              <div className="invalid-title">- 不可使用的优惠券 -</div>
              <Content
                coupons={this.state.invalid_coupons}
                selectedCouponId={selectedCouponId}
                select={this.select}
                purpose={"use"}
                invalid={"invalid"}
              />
            </>
          )}
        </div>
        {this.state.courseCouponExchange && (
          <FreeCouponCourse
            toStudy={this.toStudy}
            closeFreeCourse={this.closeFreeCourse}
            courseCouponData={this.state.courseCouponData}
          />
        )}
      </div>
    )
  }
}

function Content({ coupons, ...rest }) {
  if (coupons.length === 0) {
    return (
      <div className="empty">
        <p>暂无可使用的优惠券</p>
      </div>
    )
  }
  return (
    <ul>
      {coupons.map((item) => {
        return (
          item.id && <Coupon key={item.id} {...item} id={item.id} {...rest} />
        )
      })}
    </ul>
  )
}

function FreeCouponCourse(props) {
  const { toStudy, closeFreeCourse, courseCouponData } = props
  return (
    <div className="free-coupon-box">
      <div className="free-coupon-content">
        <div className="coures-content-success">
          <i className={"iconfont icondanseshixintubiao-5"} />
        </div>
        <div className="coures-content-title">
          恭喜你课程兑换成功!赶快去学习吧~
        </div>
        <img
          className="coures-content-img"
          src={courseCouponData.image_name}
          alt=""
        />
        {courseCouponData.course_expire != 0 && (
          <div className="coures-content-tip">
            <i className={"iconfont icondanseshixintubiao-8"} />
            <span>
              课程有效期：自今日起{courseCouponData.course_expire}
              天内，请在有效期内学习该课程哦～
            </span>
          </div>
        )}

        <a
          className="toStudy"
          onClick={() =>
            toStudy(courseCouponData.v_course_id, courseCouponData.is_is_start)
          }
        >
          去学习
        </a>
      </div>
      <div className="free-coupon-close">
        <i
          className={"iconfont iconiconfront-2"}
          onClick={() => closeFreeCourse()}
        />
      </div>
    </div>
  )
}

export default WithFullSize(UseCoupon)
