import { RRule } from "rrule";
import {
  getDynamicList,
  meetingCollection,
  updateMeetingTask,
  getHomeUserSchedule1
} from "../../api/request";
import { getDateMap, getExcludeDate, getNextDateList, getWeekNumber, getBlankList, toLocaleDateString } from './schedule.js';
import {
  getFormatDate,
  throttle,
  padZero,
  getCreateShowTime
} from "../../utils/utils";
const currentDate = new Date();
let minYear = 2020;
let maxYear = currentDate.getFullYear() + 1;
let DateMap = getDateMap(minYear, maxYear);
const weekList = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"];
import create from "dd-store";

create.Page({
  data: {
    $data: null,
    iconDay: currentDate.getDate(),
    scheduleList: [],
    todayStr: toLocaleDateString(currentDate),
    currentData: toLocaleDateString(currentDate),
    currentDataIndex: 0,
    offset: 'stop',
    show: false,
    loading: true,
    traceTime: '1970-03-01 00:00:00',
    isStopBodyScroll: false,
    dynamicList: [],
    current: 1,
    pages: 1,
    listLoading: true
  },
  scrollTop: 0,
  pageSize: 10,
  totalPages: 1,
  currentPage: 1,
  firstPage: 1,
  scheduleList: [],
  timer: null,
  isFirstLoad: true,
  onShow() {
    if (this.$store.data.indexNeedUpdate) {
      //优化:如果是重复会议重新算,单次会议往DateMap中添加
      DateMap = getDateMap(minYear, maxYear);
      this.onLoad()
    }
  },
  onLoad() {
    dd.setNavigationBar({
      title: this.$store.data.tabBarIndex == '0' ? "动态" : '日程'
    });
    //获取动态列表
    this.getPages(1);
    //获取日程列表
    this.getData();
    this.isFirstLoad = true;
  },
  //动态列表侧滑的时候禁止页面上下滑动
  setBodyDisableScroll(isStopBodyScroll) {
    this.setData({
      isStopBodyScroll
    })
  },
  //点击页面关闭侧滑模块
  closeSwipe() {
    if (this.$store.closeActiveSwipe) {
      this.$store.closeActiveSwipe()
    }
  },
  getPages(current, callBack) {
    getDynamicList({
      current,
      size: 10
    }).then(res => {
      if (!res.data.data) {
        this.setData({
          listLoading: false
        })
        return;
      }
      const dynamicList = res.data.data.records.map((item, index) => {
        for (let i = 0; i < item.meetingLogDataList.length; i++) {

          if (item.meetingLogDataList[i].creatorInfo) {
            item.meetingLogDataList[i].creatorInfo = JSON.parse(
              item.meetingLogDataList[i].creatorInfo
            );
          }
          if (item.meetingLogDataList[i].createTime) {
            item.meetingLogDataList[i].createTime = getCreateShowTime(
              item.meetingLogDataList[i].createTime
            );
          }
          let itemData = item.meetingLogDataList[i].meetingLogResource;
          if (itemData) {
            itemData.groupId = item.groupId
            if (itemData.taskInfos || itemData.fileInfos) {
              if (itemData.creatorInfo) {
                itemData.creatorInfo = JSON.parse(itemData.creatorInfo);
              }
              if (itemData.fileInfos) {
                itemData.fileInfos = JSON.parse(itemData.fileInfos);
              }
              if (itemData.taskInfos) {
                itemData.taskInfos = JSON.parse(itemData.taskInfos);
              }
              if (itemData.acceptorInfo) {
                itemData.acceptorInfo = JSON.parse(itemData.acceptorInfo);
              }
            }
          }
        }
        return item
      });

      //第一页数据会重新请求需要替换
      if (current === 1) {
        this.setData({
          dynamicList
        });
      } else {
        const newDynamicList = this.data.dynamicList.concat(dynamicList);
        this.setData({
          dynamicList: newDynamicList
        });
      }
      this.setData({
        listLoading: false,
        current: res.data.data.current,
        pages: res.data.data.pages,
      });
      if (callBack) {
        callBack()
      }
    });
  },
  //动态置顶
  changeCollection(e) {
    const { index, scheduleId, collection } = e.target.dataset;
    meetingCollection({
      scheduleId,
      collection
    }).then(res => {
      //取消置顶
      if (collection === "N") {
        // 重新获取第一页的数据 
        this.getPages(1, () => {
          dd.showToast({
            content: '取消成功'
          })
        });
      } else {
        //置顶
        const dynamicList = this.data.dynamicList;
        const replaceItem = dynamicList[index];
        dynamicList[index].traceTime = res.data.data;
        dynamicList.splice(index, 1);
        dynamicList.unshift(replaceItem);
        this.setData({
          dynamicList: dynamicList
        }, () => {
          dd.showToast({
            content: '置顶成功'
          })
        });
      }
    });
  },
  //动态上拉加载分页数据
  onScrollToLower() {
    if (this.data.current < this.data.pages) {
      this.getPages(this.data.current + 1);
    }
  },
  //动态修改状态
  onChangeTaskStatusOnList(e) {
    const data = {
      groupId: e.groupId,
      scheduleId: e.scheduleId,
      resourceType: "task",
      creatorId: getApp().globalData.userid,
      creatorInfo: getApp().globalData.userInfo,
      id: e.id,
      logType: "task_status_modify",
      taskStatus: e.status
    };
    updateMeetingTask(data).then(res => {
      if (res.data.code === 0) {
        let dataIndex1 = "";
        let dataIndex2 = "";
        this.data.dynamicList.forEach((item, index) => {
          if (item.scheduleId === e.scheduleId) {
            dataIndex1 = index;
            item.meetingLogDataList.forEach((it, index2) => {
              if (it.meetingLogResource.id == e.id) {
                dataIndex2 = index2;
              }
            });
          }
        });
        const setData = `dynamicList[${dataIndex1}].meetingLogDataList[${dataIndex2}].meetingLogResource.taskStatus`;
        this.setData({
          [setData]: e.status
        });
      }
    });
  },
  //日程获取分页数据
  getPagination(scheduleList = []) {
    this.totalPages = Math.ceil(scheduleList.length / this.pageSize);
    for (let i = 0; i < scheduleList.length; i++) {
      if (scheduleList[i].dateStr == toLocaleDateString(currentDate)) {
        this.firstPage = Math.floor(i / this.pageSize) - 2;
        this.currentPage = Math.floor(i / this.pageSize) + 2;
        break
      }
    }
  },
  getData() {
    getHomeUserSchedule1({
      startTime: "2020-01-01 00:00:00",
      endTime: "2025-12-30 23:59:59"
    }).then(res => {
      this.scheduleList = this.getScheduleList(res.data.data);
      this.getPagination(this.scheduleList);
      // 第一次加载
      this.setData({
        scheduleList: this.scheduleList.slice(this.firstPage * this.pageSize, this.currentPage * this.pageSize),
        loading: false
      });
    });
  },
  //生成DateMap值
  setDateMapValue(startTime, endTime, item, type) {
    const pushItem = {
      endTime: endTime,
      startTime: startTime,
      planDate: getFormatDate(startTime, "yyyyMMdd", "-"),
      thisDayStartTime: getFormatDate(startTime, 'HH:mm'),
      thisDayEndTime: getFormatDate(endTime, 'HH:mm'),
      confirmAttendance: item.confirmAttendance,
      title: item.title,
      id: item.id,
      isBeOverdue: currentDate.getTime() > endTime.getTime() ? true : false
    };
    //模板会议id为空
    if (type == 'repeat') {
      pushItem.scheduleTemplateId = item.id;
      pushItem.id = ''
    }

    // 如果是跨天会议,需要手动在起始天以后的其他天 添加会议日程  
    const nextDateList = getNextDateList(startTime, endTime);//返回日期包括起始天
    if (nextDateList.length > 1) {
      pushItem.isDaySpan = true;
      pushItem.isFewDays = 1;
      pushItem.isfirstDayOrEndDay = '0'// 0 第一天,1中间的天,2结束的天
      pushItem.duration = nextDateList.length;
      for (let i = 1; i < nextDateList.length; i++) {
        if (DateMap.has(nextDateList[i])) {
          DateMap.get(nextDateList[i]).unshift({
            ...pushItem,
            isFewDays: i + 1,
            isfirstDayOrEndDay: nextDateList.length - 1 === i ? "2" : "1",// 0 第一天,1中间的天,2结束的天
          });
        }
      }
    }

    if (DateMap.has(toLocaleDateString(startTime))) {
      DateMap.get(toLocaleDateString(startTime)).push(pushItem)
    }

  },
  // 根据接口返回数据生成填充DateMap
  setDateMapByResponse(response) {
    if (response) {
      // 处理单次会议 scheduleList
      const scheduleListWithTemplateId = [];
      response.scheduleList.forEach(item => {
        // 有scheduleTemplateId则是虚拟会议转成实体会议,需要替换rrule生成的模板会议
        if (item.scheduleTemplateId) {
          scheduleListWithTemplateId.push(item);
        } else {
          this.setDateMapValue(new Date(item.startTime.replace(/-/g, '/')), new Date(item.endTime.replace(/-/g, '/')), item);
        }
      });

      // 处理重复会议 templateList
      response.templateList.forEach(item => {
        //日程会议
        const itemScheduleList = scheduleListWithTemplateId.filter(it => it.scheduleTemplateId == item.id);
        // 生成rrules规则
        const initialTimeList = item.initialTime.split('-');
        const startTimeList = item.startTime.split(":");
        const DTSTART = `${initialTimeList[0]}${initialTimeList[1]}${initialTimeList[2]}T${startTimeList[0]}${startTimeList[1]}00Z`;
        const rule = RRule.fromString(
          `${item.recurrenceModel.recurrenceRule};DTSTART=${DTSTART}`
        );

        const setDateMapValueAll = (startTime, endTime, item) => {
          //如果有日程会议则用日程会议替换
          let replaceItem = [];
          if (itemScheduleList.length > 0) {
            replaceItem = itemScheduleList.filter(it => it.planDate == getFormatDate(startTime, "yyyyMMdd", "-"))
          }
          if (replaceItem.length > 0) {
            this.setDateMapValue(new Date(replaceItem[0].startTime.replace(/-/g, '/')), new Date(replaceItem[0].endTime.replace(/-/g, '/')), replaceItem[0]);
          } else {
            this.setDateMapValue(startTime, endTime, item, 'repeat');
          }
        }
        // 需要剔除某一天
        if (item.excludePlanDates) {
          const excludeData = getExcludeDate(item.excludePlanDates.split(","));
          rule.all().forEach(startTime => {
            //修正时间(时间有8小时时差)
            startTime.setHours(startTime.getHours() - 8);
            // 生成结束时间
            const endTime = new Date(startTime);
            endTime.setMinutes(endTime.getMinutes() + item.recurrenceModel.duration);
            // 剔除规则: 时间小于futureTime 时间不在单个排除日期里面
            if (startTime.getTime() < excludeData.minFutureTime &&
              !excludeData.excludeDateList.includes(getFormatDate(startTime, "yyyyMMdd", "-"))) {
              setDateMapValueAll(startTime, endTime, item);
            }
          });
        }
        // 正常生成数据
        else {
          rule.all().forEach(startTime => {
            //修正时间(时间有8小时时差)
            startTime.setHours(startTime.getHours() - 8);
            // 生成结束时间
            const endTime = new Date(startTime);
            endTime.setMinutes(endTime.getMinutes() + item.recurrenceModel.duration);
            setDateMapValueAll(startTime, endTime, item);
          });
        }
      });


    }
  },
  //日程数据
  getScheduleList(response) {
    this.setDateMapByResponse(response);
    // 取出DateMap的value值平铺到DateList
    const DateList = [];
    DateMap.forEach(function (value, key) {
      const keyDate = new Date(key);
      const year = keyDate.getFullYear();
      const month = keyDate.getMonth();
      const date = keyDate.getDate();
      const day = keyDate.getDay();

      // 生成年
      if (month === 0 && date === 1) {
        DateList.push({
          type: "year",
          value: year,
          dateStr: `${year}`
        });
      }
      //生成月
      if (date === 1) {
        DateList.push({
          type: "month",
          value: month + 1,
          dateStr: `${year}/${month + 1}`
        });
      }
      //生成周
      if (day === 0) {
        const rangeDate = new Date(year, month, date + 6);
        const rangeMonth2 = new Date(rangeDate).getMonth();
        const rangeDay2 = new Date(rangeDate).getDate();
        DateList.push({
          type: "week",
          value: `第${getWeekNumber(year, month, date)}周,${month + 1}月${date}日 - ${
            rangeMonth2 == month ? "" : rangeMonth2 + 1 + "月"
            }${rangeDay2}日`,
          dateStr: `${year}/${month + 1}/${date}-week`
        });
      }
      // 有日程长度
      if (value.length !== 0) {
        value.forEach((item, index) => {
          if (index === 0) {
            DateList.push({
              type: key !== toLocaleDateString(currentDate) ? "day" : 'today',
              week: weekList[day],
              hasDateLabel: padZero(date),
              value: item,
              dateStr: `${key}`
            });
          } else {
            DateList.push({
              type: "day",
              value: item,
              dateStr: `${key}/${item.id || item.scheduleTemplateId}`
            });
          }
        });
      } else if (value.length === 0 && key === toLocaleDateString(currentDate)) {
        DateList.push({
          type: "thisday",
          value: "",
          hasDateLabel: padZero(date),
          week: weekList[day],
          dateStr: key
        });
      }
    });
    return DateList;
  },
  //日程上拉加载
  lower() {
    if (this.currentPage < this.totalPages) {
      this.currentPage++;
      this.setData({
        scheduleList: this.scheduleList.slice(this.firstPage * this.pageSize, this.currentPage * this.pageSize)
      });
    } else {
      //超出加载一年的数据
      maxYear++;
      this.scheduleList.push(...getBlankList(maxYear));
      this.setData({
        scheduleList: this.scheduleList.slice(this.firstPage * this.pageSize)
      })
    }
  },
  onPullDownRefresh() {
    if (this.$store.data.tabBarIndex == '0') {
      this.getPages(1);
      dd.stopPullDownRefresh();
      return
    }
    //日程页面到顶部的时候才下拉加载数据,否则定位距离太长
    if (this.$store.data.tabBarIndex == '1' && this.scrollTop !== 0) {
      dd.stopPullDownRefresh();
      return
    }
    // const todayStr = this.data.scheduleList[0].dateStr;
    if (this.firstPage > 0) {
      this.firstPage--;
      this.currentPage--;
      this.setData({
        todayStr: '',
        scheduleList: this.scheduleList.slice(this.firstPage * this.pageSize, this.currentPage * this.pageSize)
      }, () => {
        this.setData({
          todayStr: this.data.scheduleList[this.pageSize - 1].dateStr
        });
        dd.stopPullDownRefresh();
      });
    } else {
      minYear--;
      const yearData = getBlankList(minYear);
      this.scheduleList.unshift(...yearData);
      this.totalPages = Math.ceil(this.scheduleList.length / this.pageSize);
      this.currentPage = Math.floor(yearData.length * 2 / this.pageSize);
      this.setData({
        todayStr: '',
        scheduleList: this.scheduleList.slice(0, yearData.length * 2),
      }, () => {
        this.setData({
          //加载一年的数据重定位可能会有点问题,重置一下
          currentData: this.scheduleList[yearData.length - 1].dateStr,
          currentDataIndex: yearData.length - 1,
          todayStr: this.scheduleList[yearData.length - 1].dateStr
        });
        dd.stopPullDownRefresh()
      })
    }
  },
  //计算高度
  caculateHeight(scrollTop) {
    let height = 0;
    let i = 0;
    while (height <= scrollTop) {
      if (this.data.scheduleList[i].type.indexOf('day') !== '-1') {
        height += this.dateHeight
      } else {
        height += this.otherHeight
      }
      i++
    }
    return i
  },
  scroll(e) {
    //计算有偏差
    // const index = this.caculateHeight(e.detail.scrollTop);
    // console.log(index)
    // if (this.data.scheduleList[index].dateStr.split('/')[1] !== this.data.currentData.split('/')[1]) {
    //   console.log('setDate: ' + this.data.scheduleList[index].dateStr)
    //   this.setData({
    //     currentData: this.data.scheduleList[index].dateStr
    //   })
    // }

    //循环次数过多
    // dd.createSelectorQuery().selectAll('.li').boundingClientRect().exec((rect) => {
    //   for (let i = rect[0].length; i > 0; i--) {
    //     if (rect[0][i] && rect[0][i].top < 50) {
    //       if (this.data.scheduleList[i].dateStr.split('/')[1] !== this.data.currentData.split('/')[1]) {
    //         this.setData({
    //           currentData: this.data.scheduleList[i].dateStr,
    //         })
    //       }
    //       break;
    //     }
    //   }
    // })

    // 一次性惯性拉到顶速度跟不上,重置
    if (e.detail.scrollTop == 0) {
      this.setData({
        currentData: this.data.scheduleList[0].dateStr,
        currentDataIndex: 0
      })
    }

    if (this.timer) {
      clearTimeout(this.timer)
    }

    this.timer = setTimeout(() => {
      this.setData({
        offset: 'stop'
      })
    }, 500)

    //每次计算偏移值
    const offset = this.getScrollOffset(e.detail.scrollTop);
    if (this.data.offset !== offset) {
      if (!this.resetToview) {
        this.setData({
          offset
        });
      }
      this.resetToview = false
    }
    dd.createSelectorQuery().selectAll('.li').boundingClientRect().exec((rect) => {
      if (offset == 'next') {
        for (let i = this.data.currentDataIndex; i < rect[0].length; i++) {
          if (rect[0][i].top > 0) {
            if (this.data.scheduleList[i].dateStr.split('/')[1] !== this.data.currentData.split('/')[1]) {
              this.setData({
                currentData: this.data.scheduleList[i].dateStr,
                currentDataIndex: i
              })
            }
            break;
          }
        }
      }
      else if (offset == 'before') {
        let i = Math.min(this.data.currentDataIndex, this.data.scheduleList.length - 1);
        for (; i > 0; i--) {
          if (rect[0][i].top < 50) {
            if (this.data.scheduleList[i].dateStr.split('/')[1] !== this.data.currentData.split('/')[1]) {
              this.setData({
                currentData: this.data.scheduleList[i].dateStr,
                currentDataIndex: i
              })
            }
            break;
          }
        }
      }
    })
  },
  //判断滚动方向
  getScrollOffset(scrollTop) {
    let offset = 'stop';
    if (scrollTop > this.scrollTop) {
      //向下滚动 
      offset = 'next'
    } else {
      //向上滚动 
      offset = 'before'
    }
    this.scrollTop = scrollTop;
    return offset

  },
  closePop() {
    this.setData({
      show: false
    });
  },
  changesidebar() {
    this.setData({
      show: true
    });
  },
  createMeeting() {
    dd.navigateTo({ url: "./../createMeeting/createMeeting" });
  },
  nextDetail: throttle(function (e) {
    dd.navigateTo({
      url: `./../meetingDetail/meetingDetail?scheduleItem=${JSON.stringify(
        e.target.dataset.item
      )}`
    });
  }, 1000),
  backToToday() {
    //需要先清空todayStr再设置才有效
    this.setData(
      {
        todayStr: ""
      },
      () => {
        this.setData({
          todayStr: toLocaleDateString(currentDate)
        });
      }
    );
  },
  // 修改tabBar
  changeTabBar(e) {
    const { tabbar, title } = e.currentTarget.dataset;
    const lastTimeTabBarIndex = this.$store.data.tabBarIndex;
    this.$store.data.tabBarIndex = tabbar;
    this.update();

    dd.setNavigationBar({
      title: title
    });
    if (tabbar == '1' && lastTimeTabBarIndex == tabbar) {
      this.backToToday();
    }
    if (this.isFirstLoad) {
      this.backToToday();
      this.isFirstLoad = false;
      this.resetToview = true;
    }
  }
});