package router

import (
	"exam_system/dao"
	"exam_system/entity"
	"exam_system/result"
	"exam_system/utils"
	"exam_system/vo"
	"net/http"
	"strconv"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/xuri/excelize/v2"
)

func ExamRecord(router *RouterPlus) {

	// 添加考试记录管理(开始考试)
	router.POST("/examRecord", AddExamRecord)
	// 提交答案
	router.PUT("/examRecord", UpdateExamRecord)
	// 获取考试记录列表
	router.GET("/examRecord/list", ExamRecordList)
	// 获取考试记录
	router.GET("/examRecord/:id", GetExamRecord)
	// 导出考试记录
	//router.router.GET("/examRecord/download",)

	r := router.Group("/admin")
	{
		// 获取考试记录管理
		r.GET("/examRecord/:id", AdminGetExamRecord)

		// 获取考试记录管理列表
		r.GET("/examRecord/list", AdminExamRecordList)

		// 删除考试记录管理
		// r.DELETE("/examRecord/:ids", AdminDeleteExamRecord)

		// 导出考试记录
		r.routerGroup.GET("/examRecord/download/:id", AdminDownloadExamRecord)

	}

}

func AddExamRecord(c *gin.Context) *result.Result {
	var examRecord entity.ExamRecord
	err := c.ShouldBindJSON(&examRecord)
	id, exists := c.Get("id")
	if !exists {
		return result.UNAUTHORIZED
	}
	examRecord.UserId = id.(int)
	if err != nil || examRecord.Id == 0 {
		return result.PARAM_ERROR
	}
	examRecord.Ip = strings.Split(c.Request.RemoteAddr, ":")[0]

	return dao.AddExamRecord(&examRecord)
}

func ExamRecordList(c *gin.Context) *result.Result {
	page, size, _, query, err := utils.Page(c)
	if err != nil {
		return result.PARAM_ERROR
	}
	uid, exists := c.Get("id")
	if !exists {
		return result.UNAUTHORIZED
	}
	return dao.ExamRecordList(page, size, query, uid.(int))
}

func GetExamRecord(c *gin.Context) *result.Result {
	idStr := c.Param("id")
	if idStr == "" {
		return result.UNKNOW_ERROR
	}
	id, err := strconv.Atoi(idStr)
	if err != nil {
		return result.UNKNOW_ERROR
	}

	uid, exists := c.Get("id")
	if !exists {
		return result.UNAUTHORIZED
	}
	return dao.ExamRecordDetail(id, uid.(int))
}

func UpdateExamRecord(c *gin.Context) *result.Result {
	var examRecord vo.ExamRecordVo
	err := c.ShouldBindJSON(&examRecord)
	if err != nil || examRecord.Id == 0 || examRecord.AnswerVo == nil || examRecord.Token == "" {
		return result.PARAM_ERROR
	}
	return dao.UpdateExamRecord(&examRecord)
}

func AdminGetExamRecord(c *gin.Context) *result.Result {
	idStr := c.Param("id")
	if idStr == "" {
		return result.UNKNOW_ERROR
	}
	id, err := strconv.Atoi(idStr)
	if err != nil {
		return result.UNKNOW_ERROR
	}

	return dao.AdminExamRecordDetail(id)
}

func AdminExamRecordList(c *gin.Context) *result.Result {
	page, size, _, query, err := utils.Page(c)
	examIdStr := c.Query("exam_id")
	if err != nil {
		return result.PARAM_ERROR
	}

	examId, _ := strconv.Atoi(examIdStr)
	return dao.AdminExamRecordList(page, size, query, examId)
}

func AdminDeleteExamRecord(c *gin.Context) *result.Result {
	idStr := c.Param("ids")
	if idStr == "" {
		return result.PARAM_ERROR
	}

	ids := strings.Split(idStr, ",")

	return dao.DeleteExamRecords(ids)
}

func AdminDownloadExamRecord(c *gin.Context) {

	idStr := c.Param("id")

	file, err := excelize.OpenFile(utils.ScorePath)
	if err != nil {
		c.JSON(http.StatusOK, result.UNKNOW_ERROR.SetMsg(err.Error()))
	}

	res := dao.AdminDownloadExamRecord(file, idStr)
	if res.Code != result.SUCCESS.Code {
		c.JSON(http.StatusOK, res)
	}

	c.Header("Content-Type", "application/octet-stream")
	c.Header("Content-Disposition", "attachment; filename=考生信息导出.xlsx")
	c.Header("Content-Transfer-Encoding", "binary")

	_ = file.Write(c.Writer)
}