package business_trip

import (
	"fmt"
	"hongze/hz_crm_api/models"
	"hongze/hz_crm_api/models/business_trip"
	"hongze/hz_crm_api/utils"
	"strconv"
	"strings"
	"time"
)

// BusinessTripCalendar
// @Title 出差日历表
// @Description 出差日历表接口
// @Param   AdminId   query   string  false       "用户id,多个用英文逗号分开"
// @Param   WeekQuery   query   int  false       "周查询: 0-本期(本周及下周); 1-前两周; 2-后两周"
// @Param   BaseQueryDate   query   string  false       "周查询时的开始日期"
// @Success 200 {object} roadshow.BusinessTripResp
// @router /calendar [get]
func (this *BusinessTrip) BusinessTripCalendar() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录，SysUser Is Empty"
		br.Ret = 408
		return
	}

	adminId := this.GetString("AdminId")
	weekQuery, _ := this.GetInt("WeekQuery")
	baseQueryDate := this.GetString("BaseQueryDate")

	approveAdminId := 66 // 测试、生产都是这个审批人id

	groupList := make([]*business_trip.BusinessTripCalendarGroup, 0)
	researcherGroup := new(business_trip.BusinessTripCalendarGroup)
	researcherGroup.GroupId = 1
	researcherGroup.GroupName = "研究员"
	researcherGroup.DepartmentId = "1"
	groupList = append(groupList, researcherGroup)

	sellerGroup := new(business_trip.BusinessTripCalendarGroup)
	sellerGroup.GroupId = 2
	sellerGroup.GroupName = "销售"
	if utils.RunMode == "debug" {
		sellerGroup.DepartmentId = "2,5"
	} else {
		sellerGroup.DepartmentId = "2,4,5,9"
	}
	groupList = append(groupList, sellerGroup)

	otherGroup := new(business_trip.BusinessTripCalendarGroup)
	otherGroup.GroupId = 3
	otherGroup.GroupName = "其他"
	if utils.RunMode == "debug" {
		otherGroup.DepartmentId = "3,7"
	} else {
		otherGroup.DepartmentId = "3,6,7,8"
	}
	groupList = append(groupList, otherGroup)

	groupLen := len(groupList)

	//fmt.Println("groupLen:", groupLen)

	var nowWeekStart time.Time
	if baseQueryDate == "" {
		now := time.Now()
		weekDay := int(now.Weekday())
		if weekDay == 6 {
			nowWeekStart, _ = time.ParseInLocation(utils.FormatDate, now.Format(utils.FormatDate), time.Local)
		} else {
			nowWeekStart, _ = time.ParseInLocation(utils.FormatDate, now.AddDate(0, 0, -(weekDay+1)).Format(utils.FormatDate), time.Local)
		}
	}
	// 查询需求是可以无限往前后两周查询, 以入参为本周开始日期
	if baseQueryDate != "" {
		t, e := time.ParseInLocation(utils.FormatDate, baseQueryDate, time.Local)
		if e != nil {
			br.Msg = "查询开始日期格式有误"
			return
		}
		nowWeekStart = t
	}

	// 前/后两周
	if weekQuery == 1 {
		nowWeekStart = nowWeekStart.AddDate(0, 0, -14)
	}
	if weekQuery == 2 {
		nowWeekStart = nowWeekStart.AddDate(0, 0, +14)
	}
	//nowWeekEnd := utils.GetNowWeekLastDay()
	//获取基于开始周的下周日期
	nextWeekStart := nowWeekStart.AddDate(0, 0, +7)
	nextWeekEnd := nowWeekStart.AddDate(0, 0, +13)

	//获取出差信息
	businessTripList, err := business_trip.GetBusinessTripList(adminId, nowWeekStart.Format(utils.FormatDate), nextWeekEnd.Format(utils.FormatDate))
	if err != nil {
		br.Msg = "获取信息失败！"
		br.ErrMsg = "获取路演信息失败！,GetBusinessTripList Err:" + err.Error()
		return
	}

	adminIdList := make([]string, 0)
	if adminId != `` {
		adminIdList = strings.Split(adminId, ",")
	}
	lenAdminIdList := len(adminIdList)

	btMap := make(map[int][]business_trip.BusinessApplyView)

	for _, v := range businessTripList {
		fmt.Println(v.ApplyRealName, v.Status, v.ArriveDate, v.ReturnDate, approveAdminId)
		// 只有沛总/admin才需要看 “待审批” 的出差, 但admin无审批权
		if v.Status == `待审批` && (sysUser.AdminId != approveAdminId && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN) {
			continue
		}
		if lenAdminIdList > 0 {
			if utils.InArrayByStr(adminIdList, strconv.Itoa(v.ApplyAdminId)) {
				findValList, ok := btMap[v.ApplyAdminId]
				if !ok {
					findValList = make([]business_trip.BusinessApplyView, 0)
				}
				btMap[v.ApplyAdminId] = append(findValList, *v)
			}
		} else {
			findValList, ok := btMap[v.ApplyAdminId]
			if !ok {
				findValList = make([]business_trip.BusinessApplyView, 0)
			}
			btMap[v.ApplyAdminId] = append(findValList, *v)
		}

		// 如果出差申请已通过，同时存在出行人的情况
		if v.Status == "已通过" && v.PeerPeopleId != `` {
			peerPeopleIdList := strings.Split(v.PeerPeopleId, ",")
			for _, peerPeopleIdStr := range peerPeopleIdList {
				peerPeopleId, err := strconv.Atoi(peerPeopleIdStr)
				if err != nil {
					br.Msg = "获取信息失败！"
					br.ErrMsg = "获取路演信息失败！,随行人异常：" + v.PeerPeopleId + "; Err:" + err.Error()
					return
				}

				// 如果不是筛选，或者，该用户在随行人名单中，那么就插入到数据中
				if lenAdminIdList <= 0 || utils.InArrayByStr(adminIdList, strconv.Itoa(peerPeopleId)) {
					findpeerPeopleValList, peerPeoPleOk := btMap[peerPeopleId]
					if !peerPeoPleOk {
						findpeerPeopleValList = make([]business_trip.BusinessApplyView, 0)
					}
					btMap[peerPeopleId] = append(findpeerPeopleValList, *v)
				}
			}
		}
	}

	for i := 0; i < groupLen; i++ {
		group := groupList[i]
		fmt.Println("group:", group.DepartmentId)

		adminList, err := business_trip.GetBusinessTripCalendar(group.DepartmentId)
		if err != nil {
			br.Msg = "获取信息失败！"
			br.ErrMsg = "获取分组信息失败！,GetBusinessTripCalendar Err:" + err.Error()
			return
		}

		setAdminList := make([]*business_trip.BusinessTripCalendarAdmin, 0)

		for _, v := range adminList {
			if findTripList, ok := btMap[v.AdminId]; ok {
				tripList := make([]*business_trip.BusinessTripCalendar, 0)
				for day := 0; day < 7; day++ {
					newDay, _ := time.ParseInLocation(utils.FormatDate, nowWeekStart.AddDate(0, 0, day).Format(utils.FormatDate), time.Local)
					weekDate := newDay.Format(utils.FormatDate)

					tripItem := new(business_trip.BusinessTripCalendar)
					for _, r := range findTripList {
						startDateT, _ := time.ParseInLocation(utils.FormatDate, r.ArriveDate, time.Local)
						endDateT, _ := time.ParseInLocation(utils.FormatDate, r.ReturnDate, time.Local)
						if r.BusinessApplyId > 0 && (newDay.Equal(startDateT) || (newDay.Equal(endDateT)) || (newDay.Before(endDateT) && newDay.After(startDateT))) {
							tripItem.City = r.City
							tripItem.BusinessApplyId = r.BusinessApplyId
							tripItem.Status = r.Status
							tripItem.Reason = r.Reason
						}
					}

					tripItem.WeekDate = weekDate
					tripItem.WeekType = "current"
					tripItem.Week = newDay.Weekday().String()
					tripList = append(tripList, tripItem)
				}

				for day := 0; day < 7; day++ {
					newDay := nextWeekStart.AddDate(0, 0, day)
					weekDate := newDay.Format(utils.FormatDate)

					tripItem := new(business_trip.BusinessTripCalendar)
					for _, r := range findTripList {
						startDateT, _ := time.ParseInLocation(utils.FormatDate, r.ArriveDate, time.Local)
						endDateT, _ := time.ParseInLocation(utils.FormatDate, r.ReturnDate, time.Local)

						if r.BusinessApplyId > 0 && (newDay.Equal(startDateT) || (newDay.Equal(endDateT)) || (newDay.Before(endDateT) && newDay.After(startDateT))) {
							tripItem.City = r.City
							tripItem.BusinessApplyId = r.BusinessApplyId
							tripItem.Status = r.Status
							tripItem.Reason = r.Reason
						}
					}
					tripItem.WeekDate = weekDate
					tripItem.WeekType = "next"
					tripItem.Week = newDay.Weekday().String()
					tripList = append(tripList, tripItem)
				}
				v.BusinessTripList = tripList
				setAdminList = append(setAdminList, v)
			}
		}
		groupList[i].AdminList = setAdminList
	}
	resp := new(business_trip.BusinessTripCalendarResp)
	resp.GroupList = groupList
	resp.BaseDate = nowWeekStart.Format(utils.FormatDate)
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
	return
}
