package handler

import (
	webServerEntity "cicv-data-closedloop/amd64/web_server/entity"
	"cicv-data-closedloop/common/config/c_db"
	"cicv-data-closedloop/common/config/c_log"
	commonEntity "cicv-data-closedloop/common/entity"
	"cicv-data-closedloop/common/util"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

var defaultTime = time.Date(2006, time.January, 2, 15, 4, 5, 0, time.Local)

// 考试开始时间
func Begin(c *gin.Context) {
	param := new(webServerEntity.ExamPao)
	// 映射到结构体
	if err := c.ShouldBindJSON(&param); err != nil {
		c_log.GlobalLogger.Error("项目启动接收请求参数报错:", err)
		c.JSON(http.StatusBadRequest, commonEntity.Response{
			Code: 500,
			Msg:  "请求体解析失败。",
		})
		return
	}
	// 插入到数据库
	sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-insert-begin_time-by-team_name.sql"])
	if err := c_db.DoTx(sqlTemplate, []any{
		param.TeamName,
		time.Now(),
	}); err != nil {
		c_log.GlobalLogger.Error("插入数据报错:", err)
		c.JSON(http.StatusBadRequest, commonEntity.Response{
			Code: 500,
			Msg:  "插入数据报错。",
		})
		return
	}
	c.JSON(http.StatusOK, commonEntity.Response{
		Code: 200,
		Msg:  "插入数据成功。",
	})
}

// 考试结束时间
func End(c *gin.Context) {
	param := new(webServerEntity.ExamPao)
	// 映射到结构体
	if err := c.ShouldBindJSON(&param); err != nil {
		c_log.GlobalLogger.Error("项目启动接收请求参数报错:", err)
		c.JSON(http.StatusBadRequest, commonEntity.Response{
			Code: 500,
			Msg:  "请求体解析失败。",
		})
		return
	}
	// 1 查询指定队伍的开始时间最新的考试是否有结束时间,如果有则不在处理,如果没有则更新
	var result webServerEntity.ExamPo
	selectSql, err := util.ReadFile(c_db.SqlFilesMap["exam-select-latest-by-team_name.sql"])
	if err != nil {
		c_log.GlobalLogger.Error("读取sql文件报错:", err)
		c.JSON(http.StatusBadRequest, commonEntity.Response{
			Code: 500,
			Msg:  "读取sql文件报错。",
		})
		return
	}
	// 可以传参数
	if err = c_db.MysqlDb.Select(&result, selectSql, param.TeamName); err != nil {
		c_log.GlobalLogger.Error("数据库查询报错:", err)
		c.JSON(http.StatusBadRequest, commonEntity.Response{
			Code: 500,
			Msg:  "数据库查询报错。",
		})
		return
	}
	c_log.GlobalLogger.Info("数据库查询成功:", result)
	if !result.EndTime.IsZero() {
		c_log.GlobalLogger.Error("赛队", param.TeamName, "重复请求考试结束接口!")
		c.JSON(http.StatusBadRequest, commonEntity.Response{
			Code: 500,
			Msg:  "重复请求。",
		})
		return
	}
	// 更新到数据库
	sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-update-end_time-by-team_name.sql"])
	if err := c_db.DoTx(sqlTemplate, []any{
		time.Now(),
		param.TeamName,
	}); err != nil {
		c_log.GlobalLogger.Error("插入数据报错:", err)
		c.JSON(http.StatusBadRequest, commonEntity.Response{
			Code: 500,
			Msg:  "插入数据报错。",
		})
		return
	}
	c.JSON(http.StatusOK, commonEntity.Response{
		Code: 200,
		Msg:  "插入数据成功。",
	})
}

// 分页查询
// todo 如果日期为默认值,则返回空""
func Page(c *gin.Context) {
	param := new(webServerEntity.ExamPagePao)
	_ = c.ShouldBindJSON(&param)
	var resultPos []webServerEntity.ExamPo
	var resultPosTotal []int
	var pageSql string
	var totalSql string
	offset := (param.CurrentPage - 1) * param.PageSize
	size := param.PageSize
	if param.TeamName == "" && param.Topic == "" {
		pageSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-page.sql"])
		totalSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-total.sql"])
		err := c_db.MysqlDb.Select(&resultPos, pageSql, offset, size)
		if err != nil {
			c_log.GlobalLogger.Error(err)
		}
		err = c_db.MysqlDb.Select(&resultPosTotal, totalSql)
		if err != nil {
			c_log.GlobalLogger.Error(err)
		}
	}
	if param.TeamName != "" && param.Topic == "" {
		pageSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-page-by-team_name.sql"])
		totalSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-total-by-team_name.sql"])
		_ = c_db.MysqlDb.Select(&resultPos, pageSql, "%"+param.TeamName+"%", offset, size)
		_ = c_db.MysqlDb.Select(&resultPosTotal, totalSql, "%"+param.TeamName+"%")
	}
	if param.TeamName == "" && param.Topic != "" {
		pageSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-page-by-topic.sql"])
		totalSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-total-by-topic.sql"])
		_ = c_db.MysqlDb.Select(&resultPos, pageSql, "%"+param.Topic+"%", offset, size)
		_ = c_db.MysqlDb.Select(&resultPosTotal, totalSql, "%"+param.Topic+"%")
	}
	if param.TeamName != "" && param.Topic != "" {
		pageSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-page-by-team_name-and-topic.sql"])
		totalSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-total-by-team_name-and-topic.sql"])
		_ = c_db.MysqlDb.Select(&resultPos, pageSql, "%"+param.TeamName+"%", "%"+param.Topic+"%", offset, size)
		_ = c_db.MysqlDb.Select(&resultPosTotal, totalSql, "%"+param.TeamName+"%", "%"+param.Topic+"%")
	}
	var resultVos []webServerEntity.ExamVo
	for _, po := range resultPos {

		resultVos = append(resultVos, webServerEntity.ExamVo{
			Id:              po.Id,
			TeamName:        po.TeamName,
			Topic:           po.Topic,
			BeginTime:       util.GetTimeString(po.BeginTime),
			EndTime:         util.GetTimeString(po.EndTime),
			ScoreOnline:     po.ScoreOnline,
			ScoreOffline:    po.ScoreOffline,
			ScoreFinal:      po.ScoreFinal,
			Details:         po.Details,
			ScoreReportPath: po.ScoreReportPath,
		})
	}

	c.JSON(http.StatusOK, commonEntity.Response{
		Code:  200,
		Msg:   "分页查询成功!",
		Data:  resultVos,
		Total: resultPosTotal[0],
	})
}

//// 评分报告pdf下载
//func Report(c *gin.Context) {
//	param := new(webServerEntity.ExamReportPao)
//	_ = c.ShouldBindJSON(&param)
//	// 1 根据ID查询数据
//	// 2 根据数据生成pdf
//	// 3 返回pdf文件流
//
//	c.JSON(http.StatusOK, commonEntity.Response{
//		Code:  200,
//		Msg:   "分页查询成功!",
//		Data:  resultVos,
//		Total: resultPosTotal[0],
//	})
//}