package controllers

import (
	"WorldEpcho/src/models"
	"WorldEpcho/src/service"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"strconv"
	"time"
)

func HandleEmbuEvaluation(c *gin.Context) {
	// 判断用户是否登录
	uid, isLogin := service.IsUserLoggedIn(c)
	if !isLogin {
		log.Println("用户未登录")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}

	appId := c.PostForm("appId")
	appName := c.PostForm("appName")
	app_Id, err := strconv.ParseInt(appId, 10, 64)
	if err != nil {
		fmt.Println("应用id类型转换失败")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "应用id类型转换失败"})
		return
	}

	// 从POST请求的body中获取前端传递的测试数据JSON字符串
	testDataJson := c.PostForm("testData")
	var testData models.TestResultData
	err = json.Unmarshal([]byte(testDataJson), &testData)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid test data format"})
		return
	}

	// 获取配置数据
	configData, err := models.GetConfigDataByAppInfo(app_Id, appName)
	if err != nil {
		fmt.Printf("根据应用id和应用名称查询应用的配置信息失败")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据应用id和应用名称查询应用的配置信息失败"})
		return
	}

	// 处理评估
	evaluateResult, err := models.ProcessEvaluation(testData, configData)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "处理embu的结果数据出错"})
		return
	}
	// 将evaluateResult转换为JSON字符串
	evaluateResultJson, err := json.Marshal(evaluateResult)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "转换评估结果为JSON字符串失败"})
		return
	}
	shareType := c.PostForm("shareType")
	// 保存评估结果到数据库
	testResult := &models.EmbuTestResult{
		AppId:          app_Id,
		Uid:            uid,
		TestData:       testDataJson,               // 直接使用JSON字符串
		EvaluateResult: string(evaluateResultJson), // 这里假设已经是JSON字符串或者将其转换为JSON字符串
		EvaluateTime:   time.Now().Unix(),
		ShareType:      shareType,
	}

	err = models.InsertTestResult(testResult)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"code": 0, "message": "保存结果数据到数据库出错"})
		return
	}

	// 将评估结果返回给前端
	c.JSON(http.StatusOK,
		gin.H{
			"code":           1,
			"message":        "Embu 评估结果成功，并保存数据库成功",
			"evaluateResult": evaluateResult,
		},
	)
}
