package services

import (
	"context"
	"fmt"
	"hongze/hongze_task/models"
	"hongze/hongze_task/utils"
	"time"
)

// StatisticsUserView 汇总统计表
func StatisticsUserViewBak(cont context.Context) (err error) {
	dateTime := time.Now().AddDate(0, 0, -1)
	dateStr := dateTime.Format(utils.FormatDate)
	count, err := models.GetUserViewStatisticsCount(dateStr)
	if err != nil {
		return
	}
	if count > 0 {
		return
	}

	{
		mobileViewMap := make(map[string]*models.UserViewMobileTotalSlice)

		list, tmpErr := models.GetCountUserViewHistoryByMobiles(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			mobileViewMap[v.Mobile] = v
		}

		list, tmpErr = models.GetReportViewMaxTimeByMobiles(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			if userViewStatistics, ok := mobileViewMap[v.Mobile]; ok {
				userViewStatistics.Total += v.Total
				if v.ViewTime.After(userViewStatistics.ViewTime) {
					userViewStatistics.ViewTime = v.ViewTime
				}
			} else {
				mobileViewMap[v.Mobile] = v
			}
		}

		list, tmpErr = models.GetAdvisoryCountUserViewHistoryByMobiles(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			if userViewStatistics, ok := mobileViewMap[v.Mobile]; ok {
				userViewStatistics.Total += v.Total
				if v.ViewTime.After(userViewStatistics.ViewTime) {
					userViewStatistics.ViewTime = v.ViewTime
				}
			} else {
				mobileViewMap[v.Mobile] = v
			}
		}

		if len(mobileViewMap) > 0 {
			tmpList := make([]*models.UserViewStatistics, 0)
			for mobile, userViewStatistics := range mobileViewMap {
				item := &models.UserViewStatistics{
					Mobile:       mobile,
					RealName:     userViewStatistics.RealName,
					CompanyName:  userViewStatistics.CompanyName,
					ViewNum:      userViewStatistics.Total,
					LastViewTime: userViewStatistics.ViewTime,
					Date:         dateTime,
					CreateTime:   time.Now(),
				}
				tmpList = append(tmpList, item)
			}
			//最后出来后,如果还有数据未插入,那么再去批量插入数据库
			if len(tmpList) > 0 {
				_ = models.AddMultiUserViewStatistics(tmpList)
			}
		}
	}

	//邮箱
	{
		emailViewMap := make(map[string]*models.UserViewEmailTotalSlice)

		list, tmpErr := models.GetCountUserViewHistoryByEmails(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			emailViewMap[v.Email] = v
		}

		list, tmpErr = models.GetReportViewMaxTimeByEmails(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			if userViewStatistics, ok := emailViewMap[v.Email]; ok {
				userViewStatistics.Total += v.Total
				if v.ViewTime.After(userViewStatistics.ViewTime) {
					userViewStatistics.ViewTime = v.ViewTime
				}
			} else {
				emailViewMap[v.Email] = v
			}
		}

		list, tmpErr = models.GetAdvisoryCountUserViewHistoryByEmails(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			if userViewStatistics, ok := emailViewMap[v.Email]; ok {
				userViewStatistics.Total += v.Total
				if v.ViewTime.After(userViewStatistics.ViewTime) {
					userViewStatistics.ViewTime = v.ViewTime
				}
			} else {
				emailViewMap[v.Email] = v
			}
		}

		if len(emailViewMap) > 0 {
			tmpList := make([]*models.UserViewStatistics, 0)
			for email, userViewStatistics := range emailViewMap {
				item := &models.UserViewStatistics{
					Email:        email,
					RealName:     userViewStatistics.RealName,
					CompanyName:  userViewStatistics.CompanyName,
					ViewNum:      userViewStatistics.Total,
					LastViewTime: userViewStatistics.ViewTime,
					Date:         dateTime,
					CreateTime:   time.Now(),
				}
				tmpList = append(tmpList, item)
			}
			//最后出来后,如果还有数据未插入,那么再去批量插入数据库
			if len(tmpList) > 0 {
				_ = models.AddMultiUserViewStatistics(tmpList)
			}
		}
	}

	StatisticsCompanyView(dateTime)
	return
}

// StatisticsCompanyView 客户统计
func StatisticsCompanyViewBak(dateTime time.Time) (err error) {
	defer func() {
		if err != nil {
			fmt.Println("err:", err)
		}
	}()
	dateStr := dateTime.Format(utils.FormatDate)
	//fmt.Println(dateStr)
	count, err := models.GetCompanyViewStatisticsCount(dateStr)
	if err != nil {
		return
	}
	if count > 0 {
		return
	}

	companyViewMap := make(map[int]*models.CompanyViewTotalSlice)
	{
		list, tmpErr := models.GetCompanyViewMobileTotalList(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			companyViewMap[v.CompanyId] = v
		}
	}
	//fmt.Println(companyViewMap)
	//邮箱
	{
		list, tmpErr := models.GetCompanyViewEmailTotalList(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {

			if userViewStatistics, ok := companyViewMap[v.CompanyId]; ok {
				userViewStatistics.Total += v.Total
			} else {
				companyViewMap[v.CompanyId] = v
			}
		}
	}

	if len(companyViewMap) > 0 {
		tmpList := make([]*models.CompanyViewStatistics, 0)
		for _, companyView := range companyViewMap {
			item := &models.CompanyViewStatistics{
				CompanyId:  companyView.CompanyId,
				ViewNum:    companyView.Total,
				Date:       dateTime,
				CreateTime: time.Now(),
			}
			tmpList = append(tmpList, item)
		}
		//最后出来后,如果还有数据未插入,那么再去批量插入数据库
		if len(tmpList) > 0 {
			err = models.AddMultiCompanyViewStatistics(tmpList)
		}
	}

	fmt.Println(dateStr, "end")
	return
}

// StatisticsUserView 汇总统计表(每天统一汇总一次)
func StatisticsUserView(cont context.Context) (err error) {
	dateTime := time.Now().AddDate(0, 0, -1)
	statisticsUserView1Hour(dateTime)
	return
}

// StatisticsCompanyView 客户统计
func StatisticsCompanyView(dateTime time.Time) (err error) {
	defer func() {
		if err != nil {
			fmt.Println("err:", err)
		}
	}()
	dateStr := dateTime.Format(utils.FormatDate)
	//fmt.Println(dateStr)
	count, err := models.GetCompanyViewStatisticsCount(dateStr)
	if err != nil {
		return
	}
	if count > 0 {
		return
	}

	companyViewMap := make(map[int]*models.CompanyViewTotalSlice)
	{
		list, tmpErr := models.GetCompanyViewMobileTotalList(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			companyViewMap[v.CompanyId] = v
		}
	}
	//fmt.Println(companyViewMap)
	//邮箱

	{
		list, tmpErr := models.GetCompanyViewEmailTotalList(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {

			if userViewStatistics, ok := companyViewMap[v.CompanyId]; ok {
				userViewStatistics.Total += v.Total
			} else {
				companyViewMap[v.CompanyId] = v
			}
		}
	}

	if len(companyViewMap) > 0 {
		for _, companyView := range companyViewMap {
			tmpCompanyViewStatistics, tmpErr := models.GetCompanyViewStatisticsByCompanyId(companyView.CompanyId, dateStr)
			if tmpErr != nil {
				if tmpErr.Error() == utils.ErrNoRow() {
					item := &models.CompanyViewStatistics{
						CompanyId:  companyView.CompanyId,
						ViewNum:    companyView.Total,
						Date:       dateTime,
						CreateTime: time.Now(),
					}
					models.AddCompanyViewStatistics(item)
				}
			} else {
				tmpCompanyViewStatistics.ViewNum = companyView.Total
				tmpCompanyViewStatistics.Update([]string{"ViewNum"})
			}
		}
	}

	fmt.Println(dateStr, "end")
	return
}

// StatisticsUserView1Hour 每个小时汇总统计表
func StatisticsUserView1Hour(cont context.Context) (err error) {
	//dateTime := time.Now().AddDate(0, 0, -1)
	dateTime := time.Now()
	statisticsUserView1Hour(dateTime)

	StatisticsCompanyView1Hour(dateTime)
	return
}

// statisticsUserView1Hour
func statisticsUserView1Hour(dateTime time.Time) (err error) {
	//dateTime := time.Now().AddDate(0, 0, -1)
	dateStr := dateTime.Format(utils.FormatDate)

	{
		mobileViewMap := make(map[string]*models.UserViewMobileTotalSlice)

		list, tmpErr := models.GetCountUserViewHistoryByMobiles(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			mobileViewMap[v.Mobile] = v
		}

		list, tmpErr = models.GetReportViewMaxTimeByMobiles(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			if userViewStatistics, ok := mobileViewMap[v.Mobile]; ok {
				userViewStatistics.Total += v.Total
				if v.ViewTime.After(userViewStatistics.ViewTime) {
					userViewStatistics.ViewTime = v.ViewTime
				}
			} else {
				mobileViewMap[v.Mobile] = v
			}
		}

		list, tmpErr = models.GetAdvisoryCountUserViewHistoryByMobiles(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			if userViewStatistics, ok := mobileViewMap[v.Mobile]; ok {
				userViewStatistics.Total += v.Total
				if v.ViewTime.After(userViewStatistics.ViewTime) {
					userViewStatistics.ViewTime = v.ViewTime
				}
			} else {
				mobileViewMap[v.Mobile] = v
			}
		}

		if len(mobileViewMap) > 0 {
			for mobile, userViewStatistics := range mobileViewMap {
				tmpUserViewStatistics, tmpErr := models.GetUserViewStatisticsByMobile(mobile, dateStr)
				if tmpErr != nil {
					if tmpErr.Error() == utils.ErrNoRow() {
						item := &models.UserViewStatistics{
							Mobile:       mobile,
							RealName:     userViewStatistics.RealName,
							CompanyName:  userViewStatistics.CompanyName,
							ViewNum:      userViewStatistics.Total,
							LastViewTime: userViewStatistics.ViewTime,
							Date:         dateTime,
							CreateTime:   time.Now(),
						}
						models.AddUserViewStatistics(item)
					}

				} else {
					tmpUserViewStatistics.ViewNum = userViewStatistics.Total
					tmpUserViewStatistics.LastViewTime = userViewStatistics.ViewTime
					tmpUserViewStatistics.Update([]string{"ViewNum", "LastViewTime"})
				}
			}
		}
	}

	//邮箱
	{
		emailViewMap := make(map[string]*models.UserViewEmailTotalSlice)

		list, tmpErr := models.GetCountUserViewHistoryByEmails(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			emailViewMap[v.Email] = v
		}

		list, tmpErr = models.GetReportViewMaxTimeByEmails(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			if userViewStatistics, ok := emailViewMap[v.Email]; ok {
				userViewStatistics.Total += v.Total
				if v.ViewTime.After(userViewStatistics.ViewTime) {
					userViewStatistics.ViewTime = v.ViewTime
				}
			} else {
				emailViewMap[v.Email] = v
			}
		}

		list, tmpErr = models.GetAdvisoryCountUserViewHistoryByEmails(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			if userViewStatistics, ok := emailViewMap[v.Email]; ok {
				userViewStatistics.Total += v.Total
				if v.ViewTime.After(userViewStatistics.ViewTime) {
					userViewStatistics.ViewTime = v.ViewTime
				}
			} else {
				emailViewMap[v.Email] = v
			}
		}

		if len(emailViewMap) > 0 {
			for email, userViewStatistics := range emailViewMap {
				tmpUserViewStatistics, tmpErr := models.GetUserViewStatisticsByEmail(email, dateStr)
				if tmpErr != nil {
					if tmpErr.Error() == utils.ErrNoRow() {
						item := &models.UserViewStatistics{
							Email:        email,
							RealName:     userViewStatistics.RealName,
							CompanyName:  userViewStatistics.CompanyName,
							ViewNum:      userViewStatistics.Total,
							LastViewTime: userViewStatistics.ViewTime,
							Date:         dateTime,
							CreateTime:   time.Now(),
						}
						models.AddUserViewStatistics(item)
					}
				} else {
					tmpUserViewStatistics.ViewNum = userViewStatistics.Total
					tmpUserViewStatistics.LastViewTime = userViewStatistics.ViewTime
					tmpUserViewStatistics.Update([]string{"ViewNum", "LastViewTime"})
				}
			}
		}
	}

	StatisticsCompanyView1Hour(dateTime)
	return
}

// StatisticsCompanyView1Hour 每个小时客户统计
func StatisticsCompanyView1Hour(dateTime time.Time) (err error) {
	defer func() {
		if err != nil {
			fmt.Println("err:", err)
		}
	}()
	dateStr := dateTime.Format(utils.FormatDate)
	//fmt.Println(dateStr)

	companyViewMap := make(map[int]*models.CompanyViewTotalSlice)
	{
		list, tmpErr := models.GetCompanyViewMobileTotalList(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {
			companyViewMap[v.CompanyId] = v
		}
	}
	//fmt.Println(companyViewMap)

	//邮箱
	{
		list, tmpErr := models.GetCompanyViewEmailTotalList(dateStr)
		if tmpErr != nil {
			err = tmpErr
			return
		}
		for _, v := range list {

			if userViewStatistics, ok := companyViewMap[v.CompanyId]; ok {
				userViewStatistics.Total += v.Total
			} else {
				companyViewMap[v.CompanyId] = v
			}
		}
	}

	if len(companyViewMap) > 0 {
		for _, companyView := range companyViewMap {
			tmpCompanyViewStatistics, tmpErr := models.GetCompanyViewStatisticsByCompanyId(companyView.CompanyId, dateStr)
			if tmpErr != nil {
				if tmpErr.Error() == utils.ErrNoRow() {
					item := &models.CompanyViewStatistics{
						CompanyId:  companyView.CompanyId,
						ViewNum:    companyView.Total,
						Date:       dateTime,
						CreateTime: time.Now(),
					}
					models.AddCompanyViewStatistics(item)
				}
			} else {
				tmpCompanyViewStatistics.ViewNum = companyView.Total
				tmpCompanyViewStatistics.Update([]string{"ViewNum"})
			}
		}
	}

	fmt.Println(dateStr, "end")
	return
}

//func Fix() {
//	StatisticsUserView1Hour(nil)
//
//	//dateTime, _ := time.ParseInLocation(utils.FormatDate, "2021-03-04", time.Local)
//	//lastDateTime, _ := time.ParseInLocation(utils.FormatDate, "2022-04-08", time.Local)
//	//i := 0
//	//for {
//	//	tmpDateTime := dateTime.AddDate(0, 0, i)
//	//	if tmpDateTime.After(lastDateTime) { //晚于昨天,那么就结束循环
//	//		break
//	//	}
//	//	StatisticsCompanyView(tmpDateTime)
//	//	i++
//	//}
//
//}