import Taro from "@tarojs/taro";
import dayjs from "dayjs";
import { Component } from "react";
import {
  Block,
  View,
  Text,
  Image,
  RichText,
  ScrollView,
} from "@tarojs/components";
import { Loading } from "@antmjs/vantui";

import "./integral_list.less";

/*** redux ***/
import { connect } from "react-redux";
import { userRefresh } from "../../store/features/userInfo";
import { otherSettingRefresh } from "../../store/features/otherSetting";
/*** redux end ***/

/** 自定义组件 **/
import Navbar from "../../components/navbar/navbar";
import PopupAlert from "../../components/popup/popup-alert";
/** 自定义组件 **/

import {
  GetOtherSetting,
  GetIntegralRule,
  GetObtainUserIntegral,
  GetIsAttentionOfficialAccount,
  GetOfficialAccount,
  GetCloseOfficialAccount,
} from "../../utils/Interface";

import { msg } from "../../utils/traoAPI";

class IntegralList extends Component<any, any> {
  constructor(props) {
    super(props);
    this.state = {
      name: "我的积分",
      userinfo: {
        ...this.props.userInfo,
      },
      otherSetting: {
        // skipAppid: "",
        // skipPath: "",
        // envVersion: "",
        ...this.props.otherSetting,
      },
      page: 1,
      list: [],
      isIntegral: false, // 积分规则
      isOfficialAccount: false, // 是否关注公众号-一年展示一次
      nodes: "",

      pageNum: 1,
      pageSize: 10,
      total: 0,
      dargState: 0,
    };
  }

  async onLoad() {
    this.initData();
    this.GetIntegralRule();
  }
  componentDidMount() {}

  componentWillUnmount() {}

  componentDidShow() {}

  componentDidHide() {}

  async initData() {
    this.GetObtainUserIntegral();
    this.GetIsAttentionOfficialAccount();
  }

  openShop = () => {
    let { otherSetting } = this.state;
    if (otherSetting.skipAppid) {
      this.goMiniProgram();
    } else {
      this.GetOtherSetting(); // 获取小程序设置：商城地址和版本
    }
  };
  // 获取小程序设置
  GetOtherSetting = async () => {
    let res = await GetOtherSetting();
    if (res.data.code === 200) {
      let { otherSetting } = this.state;
      otherSetting.skipAppid = res.data.data.skipAppid;
      otherSetting.skipPath = res.data.data.skipPath;
      otherSetting.envVersion = res.data.data.envVersion;
      this.setState({ otherSetting });
      this.goMiniProgram();
    }
  };
  goMiniProgram = () => {
    let { otherSetting } = this.state;
    Taro.navigateToMiniProgram({
      appId: otherSetting.skipAppid,
      path: otherSetting.skipPath,
      envVersion: otherSetting.envVersion,
      success() {
        // 打开成功
        // Taro.switchTab({
        //   url: "/pages/index/index",
        // });
      },
      fail() {
        // Taro.switchTab({
        //   url: "/pages/index/index",
        // });
      },
    });
  };

  // 检查是否关注公众号：只在每年的09-30号前提醒，如果没有关注则弹窗提醒
  checkOfficialAccount() {
    let currentTime = dayjs().valueOf();
    let targetTime = dayjs().month(9).day(30).valueOf();
    // 仅9月30日前触发：提醒过期弹窗
    if (currentTime <= targetTime) {
      // 检查：今年未提醒，则弹窗
      this.setState({ isOfficialAccount: true });
      // let isOfficialAccount = Taro.getStorageSync("isOfficialAccount");
      // if (isOfficialAccount) {
      //   let oldYear = isOfficialAccount;
      //   let currentYear = dayjs().format("YYYY");
      //   if (currentYear < oldYear) {
      //     // 检查：今年未提醒，则弹窗
      //     this.setState({ isOfficialAccount: true });
      //   }
      // } else {
      //   this.setState({ isOfficialAccount: true });
      // }
    }
  }

  // 用户是否已关闭提醒
  GetOfficialAccount = async () => {
    Taro.showLoading({
      title: "请求中...",
      mask: true,
    });
    let res = await GetOfficialAccount();
    if (res.data.code === 200) {
      if (!res.data.data) {
        // 如果false则是未关闭提醒
        this.checkOfficialAccount(); // 检测时间，弹窗提示关注公众号
      }
    }
  };
  // 用户是否关注公众号
  GetIsAttentionOfficialAccount = async () => {
    Taro.showLoading({
      title: "请求中...",
      mask: true,
    });
    let res = await GetIsAttentionOfficialAccount();
    if (res.data.code === 200) {
      if (!res.data.data) {
        // 如果false则是没关注
        this.GetOfficialAccount();
      }
    }
  };

  // 用户关闭提醒
  GetCloseOfficialAccount = async () => {
    let { data } = await GetCloseOfficialAccount();
    if (data.code === 200) {
      msg("已关闭提醒");
    } else {
      msg("操作失败");
    }
  };

  GetObtainUserIntegral = async () => {
    Taro.showLoading({
      title: "请求中...",
      mask: true,
    });
    let { list, pageNum, pageSize } = this.state;
    let res = await GetObtainUserIntegral({
      pageNum,
      pageSize,
    });
    if (res.data.code === 200) {
      if (res.data.rows.length) {
        let data = res.data.rows.map((item: any) => {
          item.createTime = item.createTime
            ? dayjs(item.createTime).format("YYYY-MM-DD hh:mm:ss")
            : "";
          return item;
        });

        list = [].concat(list, data);
        this.setState({ list: list, total: res.data.total, dargState: 0 });
      }
    }
  };

  GetIntegralRule = async () => {
    Taro.showLoading({
      title: "请求中...",
      mask: true,
    });
    let res = await GetIntegralRule();
    console.log("GetIntegralRule", res);
    if (res.data.code === 200) {
      let nodes = decodeURIComponent(res.data.data.value || "");
      nodes = nodes.replace(/\<img/gi, '<img style="width:100%;height:auto" ');
      nodes = nodes.replace(
        /\<table/gi,
        '<table style="border-spacing: 0;border-collapse: collapse;border: 1px solid #000" '
      );
      nodes = nodes.replace(
        /\<td/gi,
        '<td style="border: 1px solid #000;text-align:center" '
      );
      this.setState({ nodes: nodes });
    }
  };

  integralPopupShow = () => {
    this.setState({ isIntegral: true });
  };

  integralPopupClose = () => {
    this.setState({ isIntegral: false });
  };

  /** 关注公众号弹窗 */
  officialPopupConfirm = () => {
    // let currentYear = dayjs().format("YYYY");
    // Taro.setStorageSync("isOfficialAccount", currentYear); // 标记：本年度已提醒
    this.GetCloseOfficialAccount();
    this.officialPopupClose();
  };
  officialPopupClose = () => {
    this.setState({ isOfficialAccount: false });
  };

  /*** 上拉加载 ***/
  reduction = () => {
    //还原初始设置
    // const time = 0.5;
    this.setState({
      scrollY: true,
    });
  };
  touchStart = (e) => {
    this.setState({
      start_p: e.touches[0],
    });
  };
  touchmove = (e) => {
    let move_p = e.touches[0], //移动时的位置
      deviationX = 0.3, //左右偏移量(超过这个偏移量不执行下拉操做)
      deviationY = 70, //拉动长度（低于这个值的时候不执行）
      maxY = 100; //拉动的最大高度

    let start_x = this.state.start_p.clientX,
      start_y = this.state.start_p.clientY,
      move_x = move_p.clientX,
      move_y = move_p.clientY;

    //获得偏移数值
    let dev = Math.abs(move_x - start_x) / Math.abs(move_y - start_y);
    if (dev < deviationX) {
      //当偏移数值大于设置的偏移数值时则不执行操做
      let pY = Math.abs(move_y - start_y) / 3.5; //拖动倍率（使拖动的时候有粘滞的感受--试了不少次 这个倍率恰好）
      if (move_y - start_y > 0) {
        //下拉操做
        if (pY >= deviationY) {
          // this.setState({ dargState: 1, downText: "释放刷新" });
        } else {
          // this.setState({ dargState: 0, downText: "下拉刷新" });
        }
        if (pY >= maxY) {
          pY = maxY;
        }
        this.setState({
          scrollY: false, //拖动的时候禁用
        });
      }
      if (start_y - (move_y + 100) > 0) {
        //上拉操做
        // console.log("上拉操做");
        if (pY >= deviationY) {
          this.setState({ dargState: -1 });
        }
      }
    }
  };
  pull = () => {
    //上拉
    console.log("上拉");
    let { list, total, pageNum, dargState } = this.state;
    if (dargState === -1) {
      if (list.length < total) {
        this.setState({ pageNum: pageNum + 1 });
        setTimeout(() => {
          this.GetObtainUserIntegral();
        }, 100);
      }
    }
  };
  down = () => {
    //下拉
    console.log("下拉");
    // this.props.onDown()
  };
  ScrollToUpper = () => {
    //滚动到顶部事件
    console.log("滚动到顶部事件");
    // this.props.Upper()
  };
  ScrollToLower = () => {
    //滚动到底部事件
    console.log("滚动到底部事件");
    // this.props.Lower()
  };
  touchEnd = () => {
    if (this.state.dargState === 1) {
      this.down();
    } else if (this.state.dargState === -1) {
      this.pull();
    }
    // this.reduction();
  };
  /*** 上拉加载 ***/

  render() {
    let {
      list,
      userinfo,
      isIntegral,
      isOfficialAccount,
      nodes,
      dargState,
      total,
    } = this.state;
    return (
      <Block>
        <PopupAlert
          myClassName="integral"
          isLarge={true}
          isClose={true}
          isShow={isIntegral}
          title="积分规则"
          content={<RichText nodes={nodes} />}
          confirmButtonText="我知道了"
          textAlgin="center"
          close={this.integralPopupClose}
          confirm={this.integralPopupClose}
        />
        <PopupAlert
          myClassName="officialAccount"
          isLarge={true}
          isClose={true}
          isShow={isOfficialAccount}
          title="过期积分提醒"
          type="3"
          content={
            <View style={{ height: "700rpx" }}>
              <Image
                style={{
                  width: "100%",
                  height: "600rpx",
                  // backgroundColor: "#666",
                }}
                showMenuByLongpress={true} // 长按识别二维码
                src={require("../../img/qrcode-test.jpg")}
                mode="aspectFit"
              />
              <View style={{ marginTop: "20rpx" }}>
                长按图片关注公众号，可以接收积分过期提醒
              </View>
              <View style={{ marginTop: "20rpx", color: "#666" }}>
                (测试阶段公众号为：广州云强信息科技有限公司)
              </View>
            </View>
          }
          confirmButtonText="我知道了"
          textAlgin="center"
          close={this.officialPopupClose}
          confirm={this.officialPopupConfirm}
        />

        <Navbar titleSlot="我的积分" isBack={true} />

        <View style="background: #f3f3f3;padding: 33rpx 30rpx 31rpx 30rpx;">
          <View className="integral_box1">
            <View
              className="info1 flex aitems"
              onClick={this.integralPopupShow}
            >
              <View className="tip1">积分规则</View>
              <View className="icon">
                <Image
                  src={require("../../img/user/right.png")}
                  mode="aspectFill"
                />
              </View>
            </View>
            <View className="info3">可用积分</View>
            <View className="info2">{userinfo.credit}</View>
            <View className="info4 flex aitems jcenter">
              <View className="tip1" onClick={this.openShop}>
                前往积分商城
              </View>
            </View>
            <Image
              className="point_bg"
              src={require("../../img/user/point-bg.png")}
              mode="aspectFill"
            />
          </View>
        </View>

        <View className="integral_box2">
          {/* {list.length === 0 && (
            <View className="nodata">
              <Image
                className="nodata_img"
                src={require("../../img/user/points.png")}
                mode="aspectFill"
              ></Image>
              <View>暂无数据</View>
            </View>
          )}
          {list.map((item: any, key: number) => {
            return (
              <View className="list" key={key}>
                <View className="list_block flex aitems sb">
                  <View className="left">
                    <View className="tip1">{item.remarkContent}</View>
                    <View className="tip2">{item.createTime}</View>
                  </View>
                  <View className="rights" style={item.style}>
                    {item.source === "1"
                      ? "+" + item.floatScore
                      : "-" + item.floatScore}
                  </View>
                </View>
              </View>
            );
          })} */}
          <ScrollView
            onTouchMove={this.touchmove}
            onTouchEnd={this.touchEnd}
            onTouchStart={this.touchStart}
            onScrollToUpper={this.ScrollToUpper}
            onScrollToLower={this.ScrollToLower}
            className="dragUpdata"
            scrollY={this.state.scrollY}
            scrollWithAnimation
          >
            <View>
              <View>
                {list.length === 0 && (
                  <View className="nodata">
                    <Image
                      className="nodata_img"
                      src={require("../../img/user/points.png")}
                      mode="aspectFill"
                    />
                    <View className="nodata_text">暂无积分记录</View>
                  </View>
                )}
                {list.map((item: any, key: number) => {
                  return (
                    <View className="list" key={key}>
                      <View className="list_block flex aitems sb">
                        <View className="left">
                          <View className="tip1">{item.remarkContent}</View>
                          <View className="tip2">{item.createTime}</View>
                        </View>
                        <View className="rights" style={item.style}>
                          {item.source === "1"
                            ? "+" + item.floatScore
                            : "-" + item.floatScore}
                        </View>
                      </View>
                    </View>
                  );
                })}
              </View>
              <View style="height: 20rpx"></View>
            </View>
          </ScrollView>

          {list.length > 0 && list.length < total && (
            <View className="upDragBox">
              {dargState === 0 ? (
                <Text style="color: #666">上拉加载更多</Text>
              ) : (
                <Loading size="24px">加载中...</Loading>
              )}
            </View>
          )}

          {list.length > 0 && list.length === total && (
            <View style="margin: 10rpx 0;text-align: center;">
              <Text style="color: #666;">已到底部</Text>
            </View>
          )}
        </View>
      </Block>
    );
  }
}

const mapStateToProps = (state) => ({
  userInfo: state.userInfo,
  otherSetting: state.otherSetting,
});
const mapDispatchToProps = (dispatch) => ({
  userRefresh(data) {
    dispatch(userRefresh(data));
  },
  otherSettingRefresh(data) {
    dispatch(otherSettingRefresh(data));
  },
});
export default connect(mapStateToProps, mapDispatchToProps)(IntegralList);
