package controllers

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

//获取所有应用id和应用名称的映射关系
func QueryAppIdNames(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	_, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	apps, err := models.GetAppIDNames()
	if err != nil {

		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用id与应用名称出错"})
		return
	}
	response := gin.H{
		"code":    1,
		"message": "查询应用id与应用名称成功",
		"apps":    apps,
	}

	// 序列化响应数据为 JSON 字符串
	jsonData, err := json.Marshal(response)
	if err != nil {
		// 处理序列化错误
		fmt.Println("序列化 JSON 数据出错:", err)
		return
	}
	fmt.Println(config.ColorCyan, string(jsonData), config.ColorReset)
	ctx.JSON(http.StatusOK, response)
}

//创建应用接口
func CreateApplication(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	uid, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	/*
	  添加应用信息
	*/
	participatorId := []int64{uid} // 创建一个包含uid的数组

	var app = models.Application{
		AppName:        ctx.PostForm("app_name"),
		Description:    ctx.PostForm("description"),
		ConfigData:     ctx.PostForm("config_data"),
		CreatorId:      uid,
		ParticipatorId: participatorId,
		CreatedAt:      time.Now().Unix(),
		UpdatedAt:      time.Now().Unix(),
	}
	// 在数据库中创建应用
	err := models.AddApplication(&app)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": err.Error()})

		return
	}

	ctx.JSON(http.StatusOK, gin.H{"code": 1, "message": "Application created successfully"})
}

// 根据应用ID, 查询应用详情
func QueryApplication(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	_, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	idStr := ctx.PostForm("app_id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "Invalid app Id"})
		return
	}
	app, err1 := models.GetApplication(id)
	if err1 != nil {
		ctx.JSON(http.StatusNotFound, gin.H{"code": 0, "message": "Application not found"})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{"code": 1, "message": app})
}

// 更新应用信息
func EditApplication(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	_, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}

	idStr := ctx.PostForm("app_id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "转换AppId失败"})
		return
	}
	app, err1 := models.GetApplication(id)
	if err1 != nil {
		ctx.JSON(http.StatusNotFound, gin.H{"code": 0, "message": "Application not found"})
		return
	}
	app.UpdatedAt = time.Now().Unix()
	err = models.UpdateApplication(app)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "Updating application failed"})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{"code": 1, "message": "Application updated successfully"})
}

// 删除应用
func DropApplication(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	_, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	idStr := ctx.PostForm("app_id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "转换AppId失败"})
		return
	}
	err = models.DeleteApplication(id)
	if err != nil {
		ctx.JSON(http.StatusNotFound, gin.H{"code": 0, "message": "Delete operation failed"})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{"status": "Application deleted successfully"})
}

//根据参与者id获取可用的应用
func QueryApplicationsByParticipatorId(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	_, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	idStr := ctx.PostForm("participator_id")
	participator_id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "Invalid participator_id"})
		return
	}
	apps, err := models.GetApplicationsByParticipatorId(participator_id)
	if err != nil {
		fmt.Println("根据参与者id获取可用应用失败")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据参与者id获取可用应用失败"})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{"code": 1, "message": apps})
}

//根据手机号为应用添加参与者
func AddApplicationParticipator(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	_, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	phone := ctx.PostForm("phone")
	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": "应用id类型转换失败"})
		return
	}
	err = models.AddApplicationParticipant(appId, phone)
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "通过手机号添加应用参与者失败"})
	}

	ctx.JSON(http.StatusOK, gin.H{"code": 1, "message": "根据手机号添加应用参与者成功!"})
}

//根据应用ID查询参与者
func QueryParticipantsByAppID(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	_, 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": "应用id类型转换失败"})
		return
	}
	users, err := models.GetParticipantsByAppID(appId)
	if err != nil {
		fmt.Println("根据应用ID查询参与者失败:", err)
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据应用ID查询参与者失败"})
	}

	ctx.JSON(http.StatusOK, gin.H{"code": 1, "message": users})
}

//根据应用名称模糊匹配查询
func QueryApplicationLikeAppName(ctx *gin.Context) {
	/*
	   判断用户是否登录
	*/
	uid, isLogin := service.IsUserLoggedIn(ctx)
	if !isLogin {
		log.Println("用户未登录")
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	app_name := ctx.PostForm("app_name")
	apps, err := models.QueryApplicationLikeAppName(uid, app_name)
	if err != nil {
		fmt.Println(config.ColorRed, "根据应用名称模糊匹配查询失败", err, config.ColorReset)
		ctx.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据应用名称模糊匹配查询失败"})
	}
	ctx.JSON(http.StatusOK, gin.H{"code": 1, "message": apps})

}
