package routers

import (
	"WorldEpcho/src/controllers"
	"WorldEpcho/src/service"
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"net/http"
	"strings"

	//"WorldEpcho/src/wxnativepay"
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
	"net/http/httputil"
	"net/url"
)

func InitRouter() *gin.Engine {

	router := gin.Default()

	// 将本地路径映射到URL
	router.Static("/static", "static/HuaSoul")
	router.Static("/userFile", "static/user")
	router.Static("/worlds", "static/Worlds")
	router.Static("/Mass", "static/Mass")

	//设置session middleware
	store := cookie.NewStore([]byte("loginuser"))
	//web引擎router调用Use方法,将生成的Session存放到Cookie里
	//store.Options(sessions.Options{
	//	MaxAge: 3600 * 3, // 设置 Cookie 的最大存活时间为 3 小时
	//	//Path:     "/",                  // Cookie 的路径
	//	HttpOnly: true,  // 仅通过 HTTP(S) 传递,防止 XSS 攻击
	//	Secure:   false, // 在生产环境中设置为 true (需要 HTTPS)
	//	//SameSite: http.SameSiteLaxMode, // SameSite 属性
	//})
	router.Use(sessions.Sessions("WorldSession", store))

	//跨域,中间件
	router.Use(Cors())

	//Authenticatied := router.Group("/")
	//Authenticatied.Use(AuthRequired)
	//{
	//	Authenticatied.GET("/test")
	//}
	/*
	   咪咕相关的路由
	*/
	//咪咕jwt,用户登陆鉴权
	router.POST("/MiGuLoginJWT", controllers.LoginJWT)
	// 服务商创建用户接口
	router.POST("/MiGuRegisterUser", controllers.MiGuServiceProviderRegister)
	// 咪咕服务商刷新token
	router.POST("/MiGuRefreshJwtToken", controllers.RefreshJwtToken)
	//咪咕重置世界意识流2
	router.POST("/MiGuWorldResetNeuralFile", controllers.MiGuWorldResetNeuralFile)
	//查询业务经理考核世界信息
	router.POST("/MiGuQueryBusinessManagerWorldInfo", controllers.MiGuQueryBusinessManagerWorldInfo)
	//语音识别
	router.POST("/MiGuSpeechConvertor", service.MiGuTranscribeAudio)

	//======================================================================//
	//语音识别路由
	router.POST("/speechConvertor", service.TranscribeAudio)
	//AI接口绘制漫画头像
	router.POST("/GenerateAvatarHandler", service.GenerateAvatarHandler)

	// 登陆鉴权检测
	router.POST("/LoginTest", controllers.LoginTest)
	// 心跳包路由2
	router.GET("/Heartbeat2", controllers.Heartbeat2)

	{
		/*
			邀请码
		*/
		//获取邀请码
		router.GET("/getInviteCode", controllers.GetInviteCode)
		//创建一次性激活码
		router.POST("/CreateActiveCode", controllers.CreateActiveCode)

		//批量创建激活码
		router.POST("BatchCreateActiveCode", controllers.BatchCreateActiveCode)

		router.GET("/GetActivationCode", controllers.GetActivationCode)
		//为激活码续时间,小时为单位
		router.POST("/ExtendActivationCodeTime", controllers.ExtendActivationCodeTime)
		// 修改激活码的备注信息
		router.POST("/UpdateActiveCode", controllers.UpdateActiveCode)

		//用户查询月限额和绑定的激活码的过期时间
		router.POST("/GetUserAvailableMonthlyLimit", controllers.GetUserAvailableMonthlyLimit)

		//重置邀请码
		router.POST("/resetInviteCode", controllers.ResetUserInviteCode)
		//获取当前用户的所有直接邀请人
		router.POST("/queryDirectInviter", controllers.QueryDirectInviter)
		//获取当前用户的所有间接邀请的人
		router.POST("/queryIndirectInvitees", controllers.QueryIndirectInvitees)

		//上传多个模型文件夹
		//router.POST("/digitalPerson/modeFile", controllers.UploadModelFolder)
		//router.POST("/digitalPerson/modeFile", controllers.UploadFolderHandler)

		//注册:
		router.GET("/register", controllers.RegisterGet)
		router.POST("/register", controllers.RegisterPost)
		router.POST("/ServiceProviderUserRegister", controllers.ServiceProviderRegisterPost)

		router.POST("/ServiceProviderBatchAccount", controllers.ServiceProviderBatchAccount)
		// 用户注销
		router.POST("/UnregisterUser", controllers.UnregisterPost)
		//登录
		//router.GET("/login", controllers.LoginGet)
		router.POST("/login", controllers.LoginPost)
		//模拟登录接口
		router.POST("/SimulateLogin", controllers.SimulateLogin)

		// 心跳包路由
		router.GET("/heartbeat", controllers.Heartbeat)

		//获取用户信息
		router.GET("/user/userInfo", controllers.SearchUserGetById)
		//获取用户详情信息
		router.POST("/user/GetUserDetailInfo", controllers.GetUserDetailInfo)

		router.GET("/user/userAndUserDetailInfo", controllers.GetUserAndUserDetailInfo)
		//修改用户信息
		router.POST("/user/updateInfo", controllers.UpdateUserInfoPost)
		//通过手机号修改用户密码
		router.POST("/user/resetPassword", controllers.ResetUserPassword)

		//获取用户已经聊天的数字人信息
		router.GET("/user/userDpConversation", controllers.QueryUserToDpConversation)
		//获取用户与数字人的历史聊天记录
		router.POST("/chat-history", controllers.QueryUserAndDigitalPersonHistoryChatById)

		/*
		  世界推演相关接口
		*/
		//查询激活码,模拟登陆
		router.POST("/GetActivationCodeAndSimulatedLogin", controllers.GetActivationCodeAndSimulatedLogin)
		//创建世界信息
		router.POST("/worldInfo/CreateWorldInfo", controllers.CreateWorldInfo)
		//业务经理考核系统
		router.POST("/worldInfo/CreateBusinessManagerAssessmentSystem", controllers.CreateBusinessManagerAssessmentSystem)

		// 咪咕创建业务经理考核系统
		router.POST("/worldInfo/MiGuCreateBusinessManagerAssessmentSystem", controllers.MiGuCreateBusinessManagerAssessmentSystem)
		//编辑业务经理考核系统面板信息
		router.POST("/worldInfo/EditBusinessManagerAssessmentSystem", controllers.EditBusinessManagerAssessmentSystem)
		//查询业务经理考核系统的面板配置信息
		router.POST("/worldInfo/QueryBusinessManagerAssessmentSystem", controllers.QueryBusinessManagerAssessmentSystemConfigData)
		//查询业务经理考核世界信息
		router.POST("/QueryBusinessManagerWorldInfo", controllers.QueryBusinessManagerWorldInfo)

		//查询最近一次世界推演结局信息
		router.POST("/QueryWorldDeductionResultsByWorldAndUserLastTime", controllers.QueryWorldDeductionResultsByWorldAndUserLastTime)

		//查询所有的推演结果
		router.POST("/QueryWorldDeductionResults", controllers.QueryWorldDeductionResults)

		//获取用户已经聊天的世界信息
		router.GET("/user/userWorldConversation", controllers.QueryUserToWorldConversation)
		//获取用户已经聊天过的世界信息接口
		router.POST("/QueryUserIsWorldConversation", controllers.QueryUserIsWorldConversation)
		//获取用户是否与某世界进行过会话
		router.POST("/QueryUserToWorldIsExistConversation", controllers.QueryUserToWorldIsExistConversation)

		// 道具名称翻译接口
		router.POST("/translateProp", service.TranslateProp1)
		// 调用AI绘图接口
		router.POST("/AiDraw", service.AiDraw)

		//调用AI生成动漫头像接口
		router.POST("/GenerateHeadPortraitHandler", service.GenerateAvatarHandler)

		// 编辑世界信息
		router.POST("/EditWorldInfo", controllers.EditWorldInfo)

		//获取用户与世界 的历史聊天记录
		router.POST("/worldChat-history", controllers.QueryUserAndWorldHistoryChatById)
		//根据指定的时间戳获取用户与世界的历史聊天记录
		router.POST("/worldChatHistoryByIdAndChatTime", controllers.QueryUserAndWorldHistoryChatByIdAndChatTime)
		//重置世界意识流1
		router.POST("/SoulNeuralFileWorldReset", controllers.SoulNeuralFileWorldReset)

		router.POST("/QueryWorldsByLikeName", controllers.QueryWorldsByLikeName)

		//查询世界信息和世界资产
		router.POST("/QueryWorldInfoAndAsset", controllers.QueryWorldInfoAndAssetById)

		/* EMBU 测量 */
		router.POST("/EmbuEvaluation", controllers.HandleEmbuEvaluation)

		//webSocketChat控制器
		router.GET("/chat/ws", service.WsHandler)
		//多数字人聊天的websocket控制器
		router.GET("/DpChats/ws", service.DpsWsHandler)
		//世界推演
		router.GET("/WorldChats/ws", service.WorldWsHandler)

		//首页
		//routers.GET("/", controllers.HomeGet)

		//退出
		//routers.GET("/exit", controllers.ExitGet)

		/*
		   JWT鉴权
		*/
		//路由组

		v1 := router.Group("/jwt")

		v1.GET("/nextHuman", controllers.GetJwtToken)

		/*
			短信验证码
		*/
		/*
			router.POST("/get-code", func(context *gin.Context) {
						controllers.GetCode(context)
						context.JSON(http.StatusOK, gin.H{"code": 1, "message": "验证码已发送"})
					})
		*/
		//done

		//生成图形验证码
		router.POST("/ImagCode", controllers.CreateImg)
		// 图形验证码校验
		router.POST("/CheckImagCode", controllers.CheckImg)

	}
	digitalPersonGroup := router.Group("/digitalpersons")
	{
		digitalPersonGroup.POST("/add", controllers.AddDigitalPerson)
		digitalPersonGroup.POST("/id", controllers.QueryDigitalPersonByID)
		digitalPersonGroup.POST("/edit", controllers.EditDigitalPerson)
		digitalPersonGroup.POST("/delete", controllers.DropDigitalPersonByID)
		digitalPersonGroup.POST("/search", controllers.QueryLikeNameDigitalPerson)
		digitalPersonGroup.POST("/reset", controllers.SoulNeuralFileReset)

		//清除多数字人记忆文件
		digitalPersonGroup.POST("/dpsReset", controllers.SoulNeuralFileResetDps)
	}
	userInfo_appGroup := router.Group("/userInfo_app")
	{
		userInfo_appGroup.POST("/createApp", controllers.CreateApplication)
		userInfo_appGroup.POST("/getAppById", controllers.QueryApplication)
		userInfo_appGroup.POST("/updateApp", controllers.EditApplication)
		userInfo_appGroup.POST("/deleteApp", controllers.DropApplication)
		userInfo_appGroup.POST("/queryAppsByParticipatorId", controllers.QueryApplicationsByParticipatorId)
		userInfo_appGroup.POST("/addAppParticipatorId", controllers.AddApplicationParticipator)
		userInfo_appGroup.POST("/queryParticipantsByAppId", controllers.QueryParticipantsByAppID)
		userInfo_appGroup.POST("/queryApplicationLikeAppName", controllers.QueryApplicationLikeAppName)
		userInfo_appGroup.GET("/QueryAppIdNames", controllers.QueryAppIdNames)

		//从聊天记录里面获取AI的MHT测评结果,进行加强平均
		//userInfo_appGroup.POST("/CalculateMHTAvgEvaluateFromHistoryChat", controllers.CalculateMHTAvgEvaluateFromHistoryChat)
	}
	//用户应用数据的路由组
	uappdata := router.Group("/userAppData")
	{
		uappdata.POST("/queryUserAppDataByUserId", controllers.QueryUserAppDataByUserId)
		uappdata.POST("/dropUserAppDataByUidAndAppId", controllers.DropUserAppDataByUidAndAppId)
	}
	//应用组群路由
	appGroup := router.Group("/appGroup")
	{
		// 查询亲子应用组群中父母的账号和孩子的账号, QueryParentAndChildUserID
		//appGroup.POST("/QueryParentAndChildUserId", controllers.QueryParentAndChildUserID)
		appGroup.POST("/createAppGroup", controllers.CreateApplicationGroup)
		appGroup.POST("/AddUserToAppGroup", controllers.AddUserToAppGroup)
		appGroup.POST("/QueryAppGroupsByMemberID", controllers.QueryAppGroupsByMemberID)
		appGroup.POST("/DeleteMemberFromGroup", controllers.DeleteMemberFromGroup)
		appGroup.POST("/GetUserAppDataWithPermission", controllers.GetUserAppDataWithPermission)

		// 教师查询班级指定学生的MHT的AI无感测评
		//appGroup.POST("/TeacherGetStudentAIWithHistoryChatMHT", controllers.TeacherGetStudentAIWithHistoryChatMHT)

		// 根据组群编号查询组群信息 GetAppGroupByID
		//appGroup.POST("/QueryAppGroupByNo", controllers.QueryAppGroupByNo)
	}

	//用户心理咨询诊疗路由组
	//脑机端接口请求
	router.POST("/selectAiMentalClinicList", service.PostSelectAiMentalClinicList)
	//MHT快速录入接口
	router.POST("/evaluateMHTMentalClinic", service.EvaluateMHTMentalClinic)
	//获取用户MHT量表测量结果
	router.POST("/QueryUserAppDataMHTAnswer", controllers.QueryUserAppDataMHTAnswer)
	// 教师获取班级指定学生的MHT量表测量结果
	//router.POST("/TeacherGetClassStudentMHTAnswer", controllers.TeacherGetClassStudentMHTAnswer)

	// 导出学生MHT心理测评结果接口
	//router.POST("/ExportStudentMHTEvaluateToExcel", controllers.ExportStudentMHTEvaluateToExcel)
	// 教师导出MHT测评结果为Excel的接口2
	//router.POST("/TeacherExportMHTResult2Excel", controllers.ExportStudentMHTEvaluateToExcel2)

	// 学校负责人导出MHT心理咨询测评结果为Excel的接口
	//router.POST("/SchoolLeaderExportMHTResult2Excel", controllers.SchoolLeaderExportMHTResult2Excel)

	//学校负责人导出MHT心理咨询测评结果为Excel的接口2
	//router.POST("/SchoolLeaderExportMHTResult2Excel_LatestChat", controllers.SchoolLeaderExportMHTResult2Excel_LatestChat)

	//创建套餐的接口
	//router.POST("/CreateActiveCodeCombo", controllers.CreateActiveCodeCombo)
	//获取所有套餐信息接口
	//router.GET("/GetAllActiveCodeCombos", controllers.GetAllActiveCodeCombos)
	//获取激活码套餐支付二维码
	//router.POST("/WechatPrePay2Code", wxnativepay.WechatPrePay2Code)
	// 获取激活码续费套餐支付二维码
	//router.POST("/ComboRenewalFeePrePay2Code", wxnativepay.ComboRenewalFeePrePay2Code)

	// 支付通知
	// router.POST("/payNotify", wxnativepay.PayNotify)
	// 查询用户购买的激活码接口
	// router.POST("/QueryGenerateActiveCodeByWxPaySuccess", wxnativepay.QueryGenerateActiveCodeByWxPaySuccess)
	// 查询用户购买的激活码续费套餐接口
	// router.POST("/QueryComboRenewalFeeByWxPaySuccess", wxnativepay.QueryComboRenewalFeeByWxPaySuccess)
	//查询所有交易订单信息
	// router.POST("/QueryAllComboOrders", controllers.QueryAllOrders)
	//根据查询个人的订单信息
	// router.POST("/GetComboOrderByUserID", controllers.GetComboOrderByUserID)

	mentalClinic := router.Group("/MentalClinic")
	{
		//脑机回调,用户快速录入接口
		mentalClinic.POST("/data", service.ProcessData)
		mentalClinic.POST("/quickMHTMentalClinic", service.QuickMHTMentalClinic)
		//mentalClinic.POST("/evaluateMHTMentalClinic", service.EvaluateMHTMentalClinic)
	}
	//学校和班级录入
	schoolClass_group := router.Group("/SchoolAndClass")
	//学校和班级录入接口
	{
		// 查询所有学校信息
		//schoolClass_group.POST("/QueryAllSchoolInfo", controllers.QueryAllSchoolInfo)
		// 查询所有学校信息
		//schoolClass_group.POST("/QueryAllSchools", controllers.QueryAllSchools)

		//查询所有学校和班级信息
		//schoolClass_group.POST("/QueryAllSchoolInfoAndClassInfo", controllers.QueryAllSchoolInfoAndClassInfo)
		// 根据学校编号查询学校信息
		//schoolClass_group.POST("/QuerySchoolBySchoolNo", controllers.QuerySchoolBySchoolNo)
		// 根据学校名称查询学校信息
		//schoolClass_group.POST("/QuerySchoolBySchoolName", controllers.QuerySchoolBySchoolName)
		// 修改学校信息
		//schoolClass_group.POST("/UpdateSchoolInfo", controllers.UpdateSchoolInfo)
		// 根据学校编号查询所有班级信息
		//schoolClass_group.POST("/QueryClassByUserId", controllers.QueryClassByUserId)
		// 修改班级信息
		//schoolClass_group.POST("/UpdateClassInfo", controllers.UpdateClassInfo)
		// 删除学校和班级信息
		//schoolClass_group.POST("/DropSchoolAndClassInfo", controllers.DropSchoolAndClassInfo)
		// 根据班级号删除某个班级信息
		//schoolClass_group.POST("/DropClassByClassNo", controllers.DropClassByClassNo)
		// 为某学校添加班级信息操作
		//schoolClass_group.POST("/AddClassToSchool", controllers.AddClassToSchool)

		// 根据学校名称,班级编号,班级名称和应用id,查询MHT应用对应的班级群信息
		//schoolClass_group.POST("/GetClassGroupBySchoolNameAndClassNo", controllers.GetClassGroupBySchoolNameAndClassNo)

		/* ============================ 学校负责人注册接口   ==========================*/
		//schoolClass_group.POST("/RegisterSchoolLeader", controllers.RegisterSchoolLeader)

		/* ============================   ==========================*/
		schoolClass_group.POST("/QuickSchoolRegisterStuAndPatriarch", controllers.QuickSchoolRegisterStuAndPatriarch)
		// 亲子账号注册接口
		//schoolClass_group.POST("/RegisterStuAndPatriarch", controllers.RegisterStuAndPatriarch)
		// 亲子咨询
		//schoolClass_group.POST("/ParentChildConsult", controllers.ParentChildConsult)
		// 获取子女的EMBU测量结果
		//schoolClass_group.POST("/QueryChildEMBUEvaluateResult", controllers.QueryChildEMBUEvaluateResult)
		// 获取指定子女的EMBU测量结果
		//schoolClass_group.POST("/QueryChildEMBUEvaluateResultByChildUID", controllers.QueryChildEMBUEvaluateResultByChildUID)

		// 获取自己EMBU测量结果
		//schoolClass_group.POST("/GetLatestEMBUEvaluateResult", controllers.QueryLatestEMBUEvaluateResult)
		//学生注册接口
		schoolClass_group.POST("/QuickSchoolRegisterStudent", controllers.QuickSchoolRegisterStudent)
		//班级负责人和创建班级应用组群的注册接口
		schoolClass_group.POST("/QuickRegisterClassLeaderAndCreateAppGroup", controllers.QuickRegisterClassLeaderAndCreateAppGroup)
		schoolClass_group.POST("/create_school_classes", controllers.CreateSchoolAndClasses)
		schoolClass_group.POST("/QueryClassesBySchool", controllers.QueryClassesBySchool)

	}

	// 服务商接口
	ServiceProvider := router.Group("ServiceProvider")
	{
		ServiceProvider.POST("/CreateServiceProvider", controllers.CreateServiceProvider)
	}

	//创建展商信息
	//router.POST("/CreateExhibitorInfo", controllers.CreateExhibitorInfo)
	//心灵小屋和展商注册接口
	//router.POST("/ExhibitorOrMindHouseRegister", controllers.ExhibitorOrMindHouseRegister)

	// 音色克隆模型接口
	VoiceMode := router.Group("VoiceMode")
	{
		VoiceMode.POST("/GetVoiceEcho", service.GetVoiceEcho)
		VoiceMode.POST("/QueryAllModelPeopleNames", service.QueryAllModelPeopleNames)
	}
	// 微信小程序登录接口
	wechat := router.Group("wechat")
	{
		wechat.POST("/AppletWeChatRegisterOrLogin", controllers.AppletWeChatRegisterOrLogin)
		//wechat.POST("/GetWeixinAccessToken", service.GetWeixinAccessToken)
		wechat.POST("/LoginOrBindWXUserPhone", controllers.LoginOrBindWXUserPhone)
		//校验用户是否已经注册,是否已经绑定手机号
		wechat.POST("/CheckWxUserIsRegisterAndBindPhone", controllers.CheckWxUserIsRegisterAndBindPhone)
		/*
		   wechat.POST("/CreateVirtualWorldHandler", controllers.CreateVirtualWorldHandler)
		   wechat.POST("/FindWorldHandler", controllers.FindWorldHandler)
		*/

	}

	// 设置反向代理
	router.Any("/say/*name", func(c *gin.Context) {
		proxyURL, err := url.Parse("http://127.0.0.1:1233")
		if err != nil {
			log.Printf("Failed to parse proxy URL: %v", err)
		}
		c.Request.URL.Path = c.Param("name")
		proxy := httputil.NewSingleHostReverseProxy(proxyURL)
		proxy.ServeHTTP(c.Writer, c.Request)
	})
	// 角色声线分类模型接口,设置反向代理
	router.Any("/ai/*name", func(c *gin.Context) {
		proxyURL, err := url.Parse("http://127.0.0.1:19999")
		if err != nil {
			log.Printf("Failed to parse proxy URL: %v", err)
		}
		c.Request.URL.Path = c.Param("name")
		proxy := httputil.NewSingleHostReverseProxy(proxyURL)
		proxy.ServeHTTP(c.Writer, c.Request)
	})

	return router
}

func AuthRequired(c *gin.Context) {
	ip := c.GetHeader("X-Forward-For")
	fmt.Println("当前ip为", string(ip))
	ip = c.GetHeader("X-Real-Ip")
	fmt.Println("当前ip为", string(ip))
	ip = c.ClientIP()
	fmt.Println("当前ip为", string(ip))
	fmt.Println(c.String)
	//origin := c.Request.Header.Get("origin")
	//亚皮//if origin != "http://52.83.116.11:9999"
	//c.JSON(401,gin.H{"status": "Failed !"})
	c.Next()
}

//开启跨越的操作
func Cors() gin.HandlerFunc {
	return func(context *gin.Context) {
		method := context.Request.Method
		origin := context.Request.Header.Get("Origin")
		var headerKeys []string
		for k, _ := range context.Request.Header {
			headerKeys = append(headerKeys, k)
		}
		headerStr := strings.Join(headerKeys, ",")
		if headerStr != "" {
			headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr)
		} else {
			headerStr = "access-control-allow-origin, access-control-allow-headers"
		}

		if origin != "" {
			context.Writer.Header().Set("Access-Control-Allow-Origin", "*")
			context.Header("Access-Control-Allow-Origin", "*") // 设置允许访问所有域
			context.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")
			context.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")
			context.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar")
			context.Header("Access-Control-Max-Age", "172800")
			context.Header("Access-Control-Allow-Credentials", "false")
			context.Set("content-type", "application/json") //// 设置返回格式是json
		}

		if method == "OPTIONS" {
			context.JSON(http.StatusOK, "Options Request!")
		}
		//处理请求
		context.Next()
	}
}