package main

import (
	"PsycheEpic/src/models"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/xuri/excelize/v2"
	"net/http"
)

// ExportStudentInfo 导出学生信息和MHT测评结果到Excel
func ExportStudentInfo(ctx *gin.Context) {
	//uid := ctx.Query("uid")     // 假设通过查询参数接收用户ID
	//appId := ctx.Query("appId") // 假设通过查询参数接收应用ID

	// 查询用户信息
	userInfo, err := models.GetUserInfo(1)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询用户信息失败"})
		return
	}

	// 通过班级号查询班级信息
	classInfo, err := models.GetClassByNo(userInfo.ClassNo)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询班级信息失败"})
		return
	}

	// 根据应用id和应用名称查询应用的配置文件
	configData, err := models.GetConfigDataByAppInfo(6, "MHT心理咨询")
	if err != nil {
		fmt.Printf("根据应用id和应用名称查询应用的配置信息失败")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据应用id和应用名称查询应用的配置信息失败"})
		return
	}

	//从configData中获取 EvaluateResult
	EvaluateResult, ok := configData["EvaluateResult"]
	if !ok {
		fmt.Println("Key 'EvaluateResult' not found in the map")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "Key 'EvaluateResult' not found in the map"})
		return
	}
	fmt.Println("EvaluateResult: ", EvaluateResult)
	// 断言 userInfoTemplate 为字符串类型
	EvaluateResultKey, ok := EvaluateResult.([]interface{})
	if !ok {
		fmt.Println("EvaluateResult is not a []interface{}")
		return
	}

	/*
	   根据用户id和应用id查询数据库中是否存在用户MHT问卷记录
	*/

	userAppData, err := models.GetUserApplicationData(6, 1)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id和应用id查询用户MHT测量数据失败!"})
		fmt.Println("根据用户id和应用id查询用户MHT测量数据失败")
		return
	}
	EvaluateresultValue, ok := userAppData["EvaluateResult"].([]interface{})
	if !ok {
		fmt.Println("EvaluateResult is not a []interface{}")
		return
	}
	if userAppData == nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id和应用id未查询到用户MHT测量数据!"})
		fmt.Println("根据用户id和应用id未查询到用户MHT测量数据")
		return
	}
	evaluateData, err := MergeToMap(EvaluateResultKey, EvaluateresultValue)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "填充用户MHT测量数据失败!"})
		fmt.Println("填充用户MHT测量数据失败")
		return
	}

	fmt.Println("evaluateData ==> :", evaluateData)

	// 创建Excel文件
	f := excelize.NewFile()
	index, _ := f.NewSheet("Sheet1")
	// 设置表头
	f.SetCellValue("Sheet1", "A1", "学号")
	f.SetCellValue("Sheet1", "B1", "学生姓名")
	f.SetCellValue("Sheet1", "C1", "性别")
	f.SetCellValue("Sheet1", "D1", "学校名称")
	f.SetCellValue("Sheet1", "E1", "所在班级")
	f.SetCellValue("Sheet1", "F1", "MHT测评结果")

	// 填充数据
	f.SetCellValue("Sheet1", "A2", userInfo.StudentId)
	f.SetCellValue("Sheet1", "B2", userInfo.UserName)
	f.SetCellValue("Sheet1", "C2", userInfo.UserSex)
	f.SetCellValue("Sheet1", "D2", classInfo.SchoolNo) // 假设这是学校名称字段
	f.SetCellValue("Sheet1", "E2", classInfo.ClassName)
	// MHT测评结果处理
	evaluateResultStr, _ := json.Marshal(evaluateData) // 将结果转为JSON字符串便于展示
	f.SetCellValue("Sheet1", "F2", string(evaluateResultStr))

	f.SetActiveSheet(index)

	// 文件保存到服务器
	fileName := "StudentInfoAndMHT.xlsx"
	if err := f.SaveAs(fileName); err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "保存Excel文件失败"})
		return
	}

	// 返回成功信息及文件下载地址(这里假设文件已可通过URL访问)
	ctx.JSON(http.StatusOK, gin.H{
		"code":         1,
		"message":      "导出成功",
		"download_url": "http://yourserver.com/path/to/" + fileName,
	})
}

// 将两个interface{}类型的数组拼接成键值对类型的map
func MergeToMap(keys []interface{}, values []interface{}) (map[string]string, error) {
	result := make(map[string]string)

	if len(keys) != len(values) {
		return nil, fmt.Errorf("keys and values arrays have different lengths")
	}

	for i := 0; i < len(keys); i++ {
		key, ok := keys[i].(string)
		if !ok {
			return nil, fmt.Errorf("Key at index %d is not a string", i)
		}

		value, ok := values[i].(string)
		if !ok {
			return nil, fmt.Errorf("Value at index %d is not a string", i)
		}

		result[key] = value
	}

	return result, nil
}

/*func main() {
	router := gin.Default()
	router.GET("/exportMHT", ExportStudentInfo)
	router.Run(":8080")
}
*/
