package controllers

import (
	"WorldEpcho/src/config"
	database "WorldEpcho/src/datasource"
	"WorldEpcho/src/models"
	"WorldEpcho/src/service"
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"strconv"
)

//根据用户id获取用户应用数据查询接口
func QueryUserAppDataByUserId(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	uid, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	// GetUserApplicationData
	appUserData, err := models.GetUserApplicationDataByUserId(uid)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id查询用户应用数据失败"})
		return

	}
	ctx.JSON(http.StatusOK, gin.H{"code": 1, "message": appUserData})
	fmt.Println(config.ColorBlue, "appUserData: ", appUserData, config.ColorReset)

}

//根据用户id和应用id，删除用户应用数据接口
func DropUserAppDataByUidAndAppId(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	uid, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	app_id := ctx.PostForm("app_id")
	appId, err := strconv.ParseInt(app_id, 10, 64)
	if err != nil {
		fmt.Println("转换失败:", err)
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "appId类型转换失败"})
		return
	}
	err = models.DeleteUserApplication(appId, uid)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据应用id和用户id删除用户应用数据失败"})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{"code": 1, "message": "根据应用id和用户id删除用户应用数据成功"})

	fmt.Println(config.ColorBlue, "根据应用id和用户id删除用户应用数据成功!", config.ColorReset)

}

func QueryUserAppDataMHTAnswer(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	uid, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	appName := ctx.PostForm("appName")
	app_id := ctx.PostForm("app_id")
	appId, err := strconv.ParseInt(app_id, 10, 64)
	if err != nil {
		fmt.Println("转换失败:", err)
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "appId类型转换失败"})
		return
	}

	//开启事务
	session := database.Engine.NewSession()
	defer session.Close() //延迟关闭session
	err = session.Begin()
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "开启事务失败!"})
		fmt.Println("开启事务失败")
		return
	}
	// 根据应用id和应用名称查询应用的配置文件
	configData, err := models.GetConfigDataByAppInfo(appId, appName)
	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(appId, uid)
	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
	}
	ctx.JSON(http.StatusOK,
		gin.H{
			"code":           1,
			"EvaluateResult": evaluateData,
		})

}

// 将两个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
}
