package controllers

import (
	"WorldEpcho/src/config"
	database "WorldEpcho/src/datasource"
	"WorldEpcho/src/models"
	"WorldEpcho/src/service"
	"WorldEpcho/src/utils"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/go-xorm/xorm"
	"log"
	"net/http"
	"time"
)

//录入学校和班级信息接口
func CreateSchoolAndClasses(c *gin.Context) {
	/*
	   判断用户是否登录
	*/
	userID, isLogin := service.IsUserLoggedIn(c)
	if !isLogin {
		log.Println("用户未登录")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户未登录"})
		return
	}
	level, err1 := models.GetUserLevel(userID)
	if err1 != nil {
		log.Println("查询用户权限出错")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询用户权限出错"})
		return
	}
	if level > 3 {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "用户权限不足"})
		return
	}
	var schoolWithClassNames models.SchoolWithClassNames
	if err := c.BindJSON(&schoolWithClassNames); err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": err.Error()})
		return
	}
	school, exist, err1 := models.QuerySchoolByName(schoolWithClassNames.SchoolName)
	if err1 != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据学校名称查询学校信息"})
		return
	}
	if exist {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "学校名称已存在"})
		return
	}
	fmt.Println("school: ", school)

	// 生成学校ID和负责人标识码,这里只是示例,生产环境应相应更安全
	SchoolIdenfier := utils.GenerateSchoolClassCode()
	newSchool := &models.School{
		SchoolNo:      SchoolIdenfier,
		SchoolName:    schoolWithClassNames.SchoolName,
		Address:       schoolWithClassNames.Address,
		Contact:       schoolWithClassNames.Contact,
		ContactNumber: schoolWithClassNames.ContactNumber,
	}

	// 准备班级信息切片
	var classes []*models.Class
	//calssNo := utils.GenerateSchoolClassCode()

	for _, className := range schoolWithClassNames.ClassNames {
		newClass := models.Class{
			SchoolNo:  SchoolIdenfier,
			ClassName: className,
			ClassNo:   utils.GenerateSchoolClassCode(),
		}
		classes = append(classes, &newClass)
	}

	// 使用插入学校和班级的函数
	if err := models.InsertSchoolAndClasses(newSchool, classes); err != nil {
		// 如果发生错误,返回错误信息
		c.JSON(http.StatusOK, gin.H{
			"code":    0,
			"message": "Failed to create school and classes",
			"error":   err.Error(),
		})
		return
	}

	// 如果一切正常,返回成功
	response := gin.H{
		"code":    1,
		"message": "录入学校和班级信息成功",
	}
	// 序列化响应数据为 JSON 字符串
	jsonData, err := json.Marshal(response)
	if err != nil {
		// 处理序列化错误
		fmt.Println("序列化 JSON 数据出错:", err)
		return
	}
	fmt.Println(config.ColorPurple, string(jsonData), config.ColorReset)

	c.JSON(http.StatusOK, response)

}

/*
   传参学校激活码,家长手机号,家长姓名,学生学号,姓名,性别,生日
   根据信息构造两个用户,家长和学生,默认将学生放到家长的观察组,和负责人班级的观察组
   或  填写负责人识别码,手机号,密码 构建负责人注册。
*/
func QuickSchoolRegisterStuAndPatriarch(c *gin.Context) {
	//学校编号
	schoolNo := c.PostForm("schoolNo")
	//家长信息
	phone := c.PostForm("patriarch_phone")
	parent_name := c.PostForm("patriarch_name")
	//学生信息
	//unit := c.PostForm("SchoolName")
	stuNo := c.PostForm("stuNo")
	classNo := c.PostForm("classNo")
	stu_name := c.PostForm("stu_name")
	password := c.PostForm("password")
	sex := c.PostForm("sex")
	birthday := c.PostForm("birthday")
	//验证码
	sms_code := c.PostForm("sms_code")
	smsCode, bol := config.WorldLoginCacheCode.Get(phone)
	codeStr := utils.Strval(smsCode)
	fmt.Println("smsCode: ", codeStr)
	//判断表单中获取的验证码和缓存中的验证码是否相等
	if !bol && codeStr != sms_code {
		c.JSON(http.StatusOK, gin.H{
			"code":    0,
			"message": "验证码不存在或验证码错误!",
		})
		return
	}
	//组群名称
	//groupName := c.PostForm("group_name")
	//开启事务
	session := database.Engine.NewSession()
	defer session.Close() //延迟关闭session
	// 设置事务的隔离级别为 READ COMMITTED,这是允许幻读的一个较为安全的隔离级别。
	if _, err := session.Exec("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED"); err != nil {
		// 处理错误
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "设置事务隔离级别失败!"})
		fmt.Println("设置事务隔离级别失败")
		return
	}
	err := session.Begin()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "开启事务失败!"})
		fmt.Println("开启事务失败")
		return
	}

	Schexist, school, err := models.GetSchoolByNo(schoolNo)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据学校编号查询学校信息出错!"})
		fmt.Println("根据学校编号查询学校信息出错")
		return
	}
	class, err := models.GetClassByNo(classNo)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据班级编号查询班级信息出错!"})
		fmt.Println("根据班级编号查询班级信息出错")
		return
	}

	if !Schexist {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "学校信息不存在,请先录入你的学校信息!"})
		fmt.Println("学校信息不存在,请先录入你的学校信息")
		return
	}
	unit := school.SchoolName
	/* =====  家长信息录入  ==== */

	var newGroupNo string
	ClassGroupName := school.SchoolName + "_" + classNo + "_" + class.ClassName
	//ClassGroupName := school.SchoolName + "_" + classNo
	ParentGroupName := phone + "_" + stuNo
	//根据手机号查询家长用户是否存在
	Patriarch_user := &models.User{Phone: phone}
	PatriarchUserInfo := &models.UserInfo{Phone: phone}
	existPatriarchUser, exist_Patriarch, err := models.GetUserByPhone(session, Patriarch_user.Phone)
	if err != nil {
		fmt.Println("根据手机号查询用户是否存在, 查询失败")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据手机号查询用户是否存在,查询失败"})
		return
	}
	//统一设置初始密码
	//initPassWord := "88888888"
	salt := config.Conf.Md5Salt
	passStr, err := utils.MD5BySalf(password, salt)
	if err != nil {
		log.Println("密码加盐失败!")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "密码加盐失败"})
		return
	}

	if !exist_Patriarch {
		//用户不存在,需要新创建用户,为用户设置初始密码加密
		Patriarch_user.Username = phone
		Patriarch_user.Password = passStr
		Patriarch_user.Status = 0
		Patriarch_user.Level = 9
		uid, err := models.FindOrCreateOrUpdateUser(session, Patriarch_user)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "插入用户数据失败"})
			return
		}
		/*
		  将新创建的用户id赋值给用户详情信息对象
		*/
		PatriarchUserInfo.UserId = uid
		PatriarchUserInfo.UserName = parent_name
		//用户详情信息表操作
		err = models.FindOrCreateOrUpdateUserInfoByPhone(session, PatriarchUserInfo)
		if err != nil {
			fmt.Printf("向用户信息表添加用户数据失败")
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": err.Error()})
			return
		} else {
			/*应用组群操作*/
			newGroupNo = utils.GenerateInviteCode(uid)
			//家长组群权限
			PatriarchUserPermission := 0
			err := CreateNewAppGroup(session, newGroupNo, ParentGroupName, uid, PatriarchUserPermission)
			if err != nil {
				fmt.Printf("创建应用组群失败")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "创建应用组群失败"})
				return
			}
			exist, _, err := models.GetAppGroupByID(session, newGroupNo)
			if err != nil {
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用组群失败"})
				return
			}
			if !exist {
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "应用组群不存在"})
				return
			}
		}
	} else {

		/*应用组群操作*/
		//家长用户存在,判断家庭应用组群是否存在
		AppGroup, existAppGroup, err := models.FindAppGroupByGroupName(session, ParentGroupName)
		if err != nil {
			fmt.Printf("根据组群名查询组群是否存在出错")
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据组群名查询组群是否存在出错"})
			return
		}
		//组群存在的话赋值
		if existAppGroup {
			newGroupNo = AppGroup.No
		} else {
			newGroupNo = utils.GenerateInviteCode(existPatriarchUser.Id)
		}
		PatriarchUserPermission := 0
		if !existAppGroup {

			err := CreateNewAppGroup(session, newGroupNo, ParentGroupName, existPatriarchUser.Id, PatriarchUserPermission)
			if err != nil {
				fmt.Printf("创建应用组群失败")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "创建应用组群失败"})
				return
			}
		} else {
			//判断家长是否在群里
			_, exist_mem, err := models.DoesGroupContainMember(session, newGroupNo, ParentGroupName, existPatriarchUser.Id)
			if err != nil {
				fmt.Printf("查询应用组群中某个成员是否存在出错")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用组群中某个成员是否存在出错"})
				return
			}
			//如果不在群里则添加
			if !exist_mem {
				PatriarchUserPermission := 0
				err := AddStuAndTeacherToAppGroup(session, existPatriarchUser.Id, newGroupNo, PatriarchUserPermission)
				if err != nil {
					fmt.Printf("添加用户到应用组群失败")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "添加用户到应用组群失败"})
					return
				}
			}

		}

	}

	/* 学生信息 */
	//构建用户详情信息结构体对象
	Stu_userinfo := &models.UserInfo{
		StudentId: stuNo,
		Unit:      unit,
	}
	//查询用户详情信息
	exist_StuUserInfo, stu_exist, err := models.FindUserByStudentIdAndUnit(session, Stu_userinfo)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据学号和单位名称查询用户信息失败!"})
		return
	}

	if !stu_exist {
		Stu_userinfo.UserName = stu_name
		Stu_userinfo.ClassNo = classNo
		//这里没有手机号,因为手机号在表中为唯一索引,因此用手机号_学校名称的字符串存入
		CreatePhone := stuNo + "_" + unit
		//定义用户注册信息
		stu_user := &models.User{
			Username:   stuNo,
			Createtime: time.Now().Unix(),
			Password:   passStr,
			Phone:      CreatePhone,
			Level:      9,
			Status:     0,
		}
		_, id, err := models.CreateAndUpdateUser(session, stu_user)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "插入或更新用户数据失败!"})
			return
		}
		//用户详情信息表中不存在该用户的详情信息
		Stu_userinfo.UserId = id
		Stu_userinfo.UserBirthday = birthday
		Stu_userinfo.UserSex = sex
		//创建用户详情信息
		err = models.CreateUserInfo(session, Stu_userinfo)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "插入用户详情信息失败!"})
			return
		} else {

			/*
				添加学生到家长应用组群中
			*/
			Stu_userPermission := 9
			// 添加学生到家长应用组群中
			err := AddStuAndTeacherToAppGroup(session, Stu_userinfo.UserId, newGroupNo, Stu_userPermission)
			if err != nil {
				fmt.Printf("添加用户到应用组群失败")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "添加用户到应用组群失败"})
				return
			}
			/*
			 添加学生到班级应用组群中
			*/

			classGroupExist, group, err := models.DoesAppGroupExist(session, ClassGroupName)
			if err != nil {
				fmt.Printf("查询应用组群出错")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用组群出错"})
				return
			}
			GroupNo := utils.GenerateInviteCode(Stu_userinfo.UserId)
			// 班级组群不存在
			if !classGroupExist {
				Stu_userPermission = 9
				err := CreateNewAppGroup(session, GroupNo, ClassGroupName, Stu_userinfo.UserId, Stu_userPermission)
				if err != nil {
					fmt.Printf("创建应用组群失败")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "创建应用组群失败"})
					return
				}
				// 根据用户id和组群号查询用户权限
				/*	_, groupPermission, err := models.GetUserPermission(session, GroupNo, Stu_userinfo.UserId)
					if err != nil {
						fmt.Printf("根据用户id和组群号查询用户权限出错")
						c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id和组群号查询用户权限出错"})
						return
					}
					groupPermission.Permission = 9
					_, err = models.UpdateAppGroupPermission(session, groupPermission)
					if err != nil {
						fmt.Printf("更新用户权限出错")
						c.JSON(http.StatusOK, gin.H{"code": 0, "message": "更新用户权限出错"})
						return
					}
				*/
			} else {
				//如果班级应用组群存在,直接添加学生入群
				Stu_userPermission = 9
				err := AddStuAndTeacherToAppGroup(session, Stu_userinfo.UserId, group.No, Stu_userPermission)
				if err != nil {
					fmt.Printf("添加用户到应用组群失败")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "添加用户到应用组群失败"})
					return
				}
			}

		}

	} else {
		//用户已经存在,添加学生到应用组群中
		//判断学生是否已经在家长的应用组群中,如果存在则不添加,不存在添加入群
		_, exist_mem, err := models.DoesGroupContainMember(session, newGroupNo, ParentGroupName, exist_StuUserInfo.UserId)
		if err != nil {
			fmt.Printf("查询应用组群中某个成员是否存在出错")
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用组群中某个成员是否存在出错"})
			return
		}
		if !exist_mem {

			Stu_userPermission := 9
			err := AddStuAndTeacherToAppGroup(session, exist_StuUserInfo.UserId, newGroupNo, Stu_userPermission)
			if err != nil {
				fmt.Printf("添加用户到应用组群失败")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "添加用户到应用组群失败"})
				return
			}
		}

		/*
		 添加学生到班级应用组群中
		*/
		//根据组群名称查询班级应用组群是否存在,如果存在则入群,不存在则创建并入群,并修改学生的权限
		classGroupExist, group, err := models.DoesAppGroupExist(session, ClassGroupName)
		if err != nil {
			fmt.Printf("查询应用组群出错")
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用组群出错"})
			return
		}
		GroupNo := utils.GenerateInviteCode(Stu_userinfo.UserId)
		Stu_userPermission := 9
		if !classGroupExist {
			err := CreateNewAppGroup(session, GroupNo, ClassGroupName, Stu_userinfo.UserId, Stu_userPermission)
			if err != nil {
				fmt.Printf("创建应用组群失败")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "创建应用组群失败"})
				return
			}
			// 根据用户id和组群号查询用户权限出错
			_, groupPermission, err := models.GetUserPermission(session, GroupNo, Stu_userinfo.UserId)
			if err != nil {
				fmt.Printf("根据用户id和组群号查询用户权限出错")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id和组群号查询用户权限出错"})
				return
			}
			groupPermission.Permission = 9
			_, err = models.UpdateAppGroupPermission(session, groupPermission)
			if err != nil {
				fmt.Printf("更新用户权限出错")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "更新用户权限出错"})
				return
			}

		} else {
			//如果班级应用组群存在,直接添加学生入群
			err := AddStuAndTeacherToAppGroup(session, Stu_userinfo.UserId, group.No, Stu_userPermission)
			if err != nil {
				fmt.Printf("添加用户到应用组群失败")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "添加用户到应用组群失败"})
				return
			}
		}

	}
	// 提交事务
	err = session.Commit()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "提交事务失败!"})
		fmt.Println("提交事务失败")
		return
	}

	response := gin.H{
		"code":    1,
		"message": "用户表和用户详情信息表数据录入成功,创建组群成功",
	}
	// 序列化响应数据为 JSON 字符串
	jsonData, err := json.Marshal(response)
	if err != nil {
		// 处理序列化错误
		fmt.Println("序列化 JSON 数据出错:", err)
		return
	}
	fmt.Println("用户表和用户详情信息表数据录入成功,创建组群成功, Response:", string(jsonData))
	fmt.Println(config.ColorGreen, "用户表和用户详情信息表数据录入成功,创建组群成功", config.ColorReset)
	c.JSON(http.StatusOK, response)

}

/*
   家长不需要注册
*/
func QuickSchoolRegisterStudent(c *gin.Context) {
	//学校编号
	schoolNo := c.PostForm("schoolNo")
	stuNo := c.PostForm("stuNo")
	classNo := c.PostForm("classNo")
	stu_name := c.PostForm("stu_name")
	password := c.PostForm("password")
	sex := c.PostForm("sex")
	birthday := c.PostForm("birthday")

	//开启事务
	session := database.Engine.NewSession()
	defer session.Close() //延迟关闭session
	// 设置事务的隔离级别为 READ COMMITTED,这是允许幻读的一个较为安全的隔离级别。
	if _, err := session.Exec("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED"); err != nil {
		// 处理错误
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "设置事务隔离级别失败!"})
		fmt.Println("设置事务隔离级别失败")
		return
	}
	err := session.Begin()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "开启事务失败!"})
		fmt.Println("开启事务失败")
		return
	}

	Schexist, school, err := models.GetSchoolByNo(schoolNo)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据学校编号查询学校信息出错!"})
		fmt.Println("根据学校编号查询学校信息出错")
		return
	}
	class, err := models.GetClassByNo(classNo)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据班级编号查询班级信息出错!"})
		fmt.Println("根据班级编号查询班级信息出错")
		return
	}

	if !Schexist {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "学校信息不存在,请先录入你的学校信息!"})
		fmt.Println("学校信息不存在,请先录入你的学校信息")
		return
	}
	unit := school.SchoolName

	ClassGroupName := school.SchoolName + "_" + classNo + "_" + class.ClassName

	salt := config.Conf.Md5Salt
	passStr, err := utils.MD5BySalf(password, salt)
	if err != nil {
		log.Println("密码加盐失败!")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "密码加盐失败"})
		return
	}

	/* 学生信息 */
	//构建用户详情信息结构体对象
	Stu_userinfo := &models.UserInfo{
		StudentId: stuNo,
		Unit:      unit,
	}
	//查询用户详情信息
	exist_StuUserInfo, stu_exist, err := models.FindUserByStudentIdAndUnit(session, Stu_userinfo)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据学号和单位名称查询用户信息失败!"})
		return
	}

	if !stu_exist {
		Stu_userinfo.UserName = stu_name
		Stu_userinfo.ClassNo = classNo
		//这里没有手机号,因为手机号在表中为唯一索引,因此用手机号_学校名称的字符串存入
		CreatePhone := stuNo + "_" + unit
		//定义用户注册信息
		stu_user := &models.User{
			Username:   stuNo,
			Createtime: time.Now().Unix(),
			Password:   passStr,
			Phone:      CreatePhone,
			Level:      9,
			Status:     0,
		}
		_, id, err := models.CreateAndUpdateUser(session, stu_user)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "插入或更新用户数据失败!"})
			return
		}
		//用户详情信息表中不存在该用户的详情信息
		Stu_userinfo.UserId = id
		Stu_userinfo.UserBirthday = birthday
		Stu_userinfo.UserSex = sex
		//创建用户详情信息
		err = models.CreateUserInfo(session, Stu_userinfo)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "插入用户详情信息失败!"})
			return
		} else {

			/*
			 添加学生到班级应用组群中
			*/

			classGroupExist, group, err := models.DoesAppGroupExist(session, ClassGroupName)
			if err != nil {
				fmt.Printf("查询应用组群出错")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用组群出错"})
				return
			}
			GroupNo := utils.GenerateInviteCode(Stu_userinfo.UserId)
			// 班级组群不存在
			if !classGroupExist {
				Stu_userPermission := 9
				err := CreateNewAppGroup(session, GroupNo, ClassGroupName, Stu_userinfo.UserId, Stu_userPermission)
				if err != nil {
					fmt.Printf("创建应用组群失败")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "创建应用组群失败"})
					return
				}

			} else {
				//如果班级应用组群存在,直接添加学生入群
				Stu_userPermission := 9
				err := AddStuAndTeacherToAppGroup(session, Stu_userinfo.UserId, group.No, Stu_userPermission)
				if err != nil {
					fmt.Printf("添加用户到应用组群失败")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "添加用户到应用组群失败"})
					return
				}
			}

		}

	} else {
		//用户已经存在,添加学生到应用组群中
		//exist_StuUserInfo
		/*
		 添加学生到班级应用组群中
		*/
		//根据组群名称查询班级应用组群是否存在,如果存在则入群,不存在则创建并入群,并修改学生的权限
		classGroupExist, group, err := models.DoesAppGroupExist(session, ClassGroupName)
		if err != nil {
			fmt.Printf("查询应用组群出错")
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用组群出错"})
			return
		}
		GroupNo := utils.GenerateInviteCode(exist_StuUserInfo.UserId)

		Stu_userPermission := 9
		if !classGroupExist {
			err := CreateNewAppGroup(session, GroupNo, ClassGroupName, exist_StuUserInfo.UserId, Stu_userPermission)
			if err != nil {
				fmt.Printf("创建应用组群失败")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "创建应用组群失败"})
				return
			}

			// 根据用户id和组群号查询用户权限出错
			_, groupPermission, err := models.GetUserPermission(session, GroupNo, exist_StuUserInfo.UserId)
			if err != nil {
				fmt.Printf("根据用户id和组群号查询用户权限出错")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id和组群号查询用户权限出错"})
				return
			}
			groupPermission.Permission = 9
			_, err = models.UpdateAppGroupPermission(session, groupPermission)
			if err != nil {
				fmt.Printf("更新用户权限出错")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "更新用户权限出错"})
				return
			}

		} else {
			//如果班级应用组群存在,直接添加学生入群
			err := AddStuAndTeacherToAppGroup(session, Stu_userinfo.UserId, group.No, Stu_userPermission)
			if err != nil {
				fmt.Printf("添加用户到应用组群失败")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "添加用户到应用组群失败"})
				return
			}
		}

	}
	// 提交事务
	err = session.Commit()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "提交事务失败!"})
		fmt.Println("提交事务失败")
		return
	}

	response := gin.H{
		"code":    1,
		"message": "用户表和用户详情信息表数据录入成功,创建组群成功",
	}
	// 序列化响应数据为 JSON 字符串
	jsonData, err := json.Marshal(response)
	if err != nil {
		// 处理序列化错误
		fmt.Println("序列化 JSON 数据出错:", err)
		return
	}
	fmt.Println("用户表和用户详情信息表数据录入成功,创建组群成功, Response:", string(jsonData))
	fmt.Println(config.ColorGreen, "用户表和用户详情信息表数据录入成功,创建组群成功", config.ColorReset)
	c.JSON(http.StatusOK, response)

}

/*
  填写负责人班级码,手机号,密码 构建负责人注册或负责人班级的观察组
*/
func QuickRegisterClassLeaderAndCreateAppGroup(c *gin.Context) {
	//学校编号
	schoolNo := c.PostForm("schoolNo")
	classNo := c.PostForm("classNo")
	classLeaderName := c.PostForm("classLeaderName")
	password := c.PostForm("password")
	phone := c.PostForm("phone")
	//groupName := c.PostForm("groupName")
	sms_code := c.PostForm("sms_code")
	smsCode, bol := config.WorldLoginCacheCode.Get(phone)
	codeStr := utils.Strval(smsCode)
	fmt.Println("smsCode: ", codeStr)
	//判断表单中获取的验证码和缓存中的验证码是否相等
	if !bol && codeStr != sms_code {
		c.JSON(http.StatusOK, gin.H{
			"code":    0,
			"message": "验证码不存在或验证码错误!",
		})
		return
	}
	var newGroupNo string
	//开启事务
	session := database.Engine.NewSession()
	defer session.Close() //延迟关闭session
	// 设置事务的隔离级别为 READ COMMITTED,这是允许幻读的一个较为安全的隔离级别。
	if _, err := session.Exec("SET TRANSACTION ISOLATION LEVEL READ COMMITTED"); err != nil {
		// 处理错误
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "设置事务隔离级别失败!"})
		fmt.Println("设置事务隔离级别失败")
		return
	}
	err := session.Begin()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "开启事务失败!"})
		fmt.Println("开启事务失败")
		return
	}
	Schexist, school, err := models.GetSchoolByNo(schoolNo)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据学校编号查询学校信息出错!"})
		fmt.Println("根据学校编号查询学校信息出错")
		return
	}
	if !Schexist {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "学校信息不存在,请先录入你的学校信息!"})
		fmt.Println("学校信息不存在,请先录入你的学校信息")
		return
	}
	//组群名称
	ClassGroupName := school.SchoolName + "_" + classNo

	//统一设置初始密码
	//initPassWord := "88888888"
	salt := config.Conf.Md5Salt
	passStr, err := utils.MD5BySalf(password, salt)
	if err != nil {
		log.Println("密码加盐失败!")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "密码加盐失败"})
		return
	}
	Teacher_user := &models.User{Phone: phone}
	TeacherUserInfo := &models.UserInfo{Phone: phone}
	class := &models.Class{SchoolNo: schoolNo, ClassNo: classNo}

	//根据手机号查询教师用户是否存在
	existTeacherUser, exist, err := models.GetUserByPhone(session, phone)
	if err != nil {
		fmt.Println("根据手机号查询用户是否存在, 查询失败")
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据手机号查询用户是否存在,查询失败"})
		return
	}
	if !exist {
		//用户不存在,需要新创建用户,为用户设置初始密码加密
		Teacher_user.Username = phone
		Teacher_user.Password = passStr
		Teacher_user.Status = 0
		Teacher_user.Level = 9
		Teacher_user.Createtime = time.Now().Unix()
		uid, err := models.FindOrCreateOrUpdateUser(session, Teacher_user)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "插入用户数据失败"})
			return
		}
		// 更新班级表中班级负责人信息
		class.Leader = uid
		class.ContactInfo = phone
		err = models.UpdateClassInfo(session, class)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "更新班级表中班级负责人信息出错"})
			return
		}
		/*
		  将新创建的用户id赋值给用户详情信息对象
		*/
		TeacherUserInfo.UserId = uid
		TeacherUserInfo.UserName = classLeaderName
		TeacherUserInfo.Phone = phone
		TeacherUserInfo.CreatedAt = time.Now().Unix()
		TeacherUserInfo.UpdatedAt = time.Now().Unix()
		//用户详情信息表操作
		err = models.FindOrCreateOrUpdateUserInfoByPhone(session, TeacherUserInfo)
		if err != nil {
			fmt.Printf("向用户信息表添加用户数据失败")
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": err.Error()})
			return
		} else {
			/*应用组群操作, 组群名称为: 学校名称_班级号*/
			//根据组群名称查询班级应用组群是否存在,如果存在则入群,不存在则创建并入群,并修改教师权限为管理员权限
			classGroupExist, ClassGroup, err := models.DoesAppGroupExist(session, ClassGroupName)
			fmt.Println("查询班级应用组群是否存在: ", classGroupExist)
			if err != nil {
				fmt.Printf("查询应用组群出错")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用组群出错"})
				return
			}
			//班级组群不存在
			if !classGroupExist {
				//生成班级号
				ClassGroupNo := utils.GenerateInviteCode(TeacherUserInfo.UserId)
				TeacherPermission := 0
				err := CreateNewAppGroup(session, ClassGroupNo, ClassGroupName, TeacherUserInfo.UserId, TeacherPermission)
				if err != nil {
					fmt.Printf("创建应用组群失败")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "创建应用组群失败"})
					return
				}
				// 根据用户id和组群号查询用户权限出错
				/*
					_, groupPermission, err := models.GetUserPermission(session, ClassGroupNo, TeacherUserInfo.UserId)
					if err != nil {
						fmt.Printf("根据用户id和组群号查询用户权限出错")
						c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id和组群号查询用户权限出错"})
						return
					}
					//判断老师权限是否为0,不为0则修改为0
					if groupPermission.Permission != 0 {
						groupPermission.Permission = 0
						_, err := models.UpdateAppGroupPermission(session, groupPermission)
						if err != nil {
							fmt.Printf("更新用户权限出错")
							c.JSON(http.StatusOK, gin.H{"code": 0, "message": "更新用户权限出错"})
							return
						}
					}
				*/

			} else {
				//如果班级的应用组群存在,直接添加教师入群
				//添加之前判断教师是否已经在群里
				_, has_merm, err := models.DoesGroupContainMember(session, ClassGroup.No, ClassGroupName, TeacherUserInfo.UserId)
				if err != nil {
					fmt.Printf("查询教师用户是否已经在群里")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询教师用户是否已经在群里"})
					return
				}
				if !has_merm {
					// 教师不在班级群
					TeacherPermission := 0
					err = AddStuAndTeacherToAppGroup(session, TeacherUserInfo.UserId, ClassGroup.No, TeacherPermission)
					if err != nil {
						fmt.Printf("添加用户到应用组群失败")
						c.JSON(http.StatusOK, gin.H{"code": 0, "message": "添加用户到应用组群失败"})
						return
					}
					// 根据用户id和组群号查询用户权限
					/*_, groupPermission, err := models.GetUserPermission(session, ClassGroup.No, TeacherUserInfo.UserId)
					if err != nil {
						fmt.Printf("根据用户id和组群号查询用户权限出错")
						c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id和组群号查询用户权限出错"})
						return
					}
					//判断老师权限是否为0,不为0则修改为0
					if groupPermission.Permission != 0 {
						groupPermission.Permission = 0
						_, err := models.UpdateAppGroupPermission(session, groupPermission)
						if err != nil {
							fmt.Printf("更新用户权限出错")
							c.JSON(http.StatusOK, gin.H{"code": 0, "message": "更新用户权限出错"})
							return
						}
					}
					*/

				}

			}

		}

	} else {

		//教师用户存在,判断组群是否存在
		/*应用组群操作, 组群名称为: 学校名称_班级号*/
		// 更新班级表中班级负责人信息
		class.Leader = existTeacherUser.Id
		class.ContactInfo = phone
		err = models.UpdateClassInfo(session, class)
		if err != nil {
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "更新班级表中班级负责人信息出错"})
			return
		}
		// 根据班级组群名查询应用组群是否存在
		AppGroup, existAppGroup, err := models.FindAppGroupByGroupName(session, ClassGroupName)
		if err != nil {
			fmt.Printf("根据组群名查询组群是否存在出错")
			c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据组群名查询组群是否存在出错"})
			return
		}
		//组群存在的话
		if existAppGroup {
			newGroupNo = AppGroup.No
		}
		if !existAppGroup {
			TeacherPermission := 0
			newGroupNo = utils.GenerateInviteCode(existTeacherUser.Id)
			err := CreateNewAppGroup(session, newGroupNo, ClassGroupName, existTeacherUser.Id, TeacherPermission)
			if err != nil {
				fmt.Printf("创建应用组群失败")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "创建应用组群失败"})
				return
			}
			// 根据用户id和组群号查询用户权限出错
			/*
				_, groupPermission, err := models.GetUserPermission(session, newGroupNo, existTeacherUser.Id)
				if err != nil {
					fmt.Printf("根据用户id和组群号查询用户权限出错")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id和组群号查询用户权限出错"})
					return
				}
				//判断老师权限是否为0,不为0则修改为0
				if groupPermission.Permission != 0 {
					groupPermission.Permission = 0
					_, err := models.UpdateAppGroupPermission(session, groupPermission)
					if err != nil {
						fmt.Printf("更新用户权限出错")
						c.JSON(http.StatusOK, gin.H{"code": 0, "message": "更新用户权限出错"})
						return
					}
				}
			*/

		} else {

			//如果班级的应用组群存在,直接添加教师入群
			_, exist_mem, err := models.DoesGroupContainMember(session, AppGroup.No, ClassGroupName, existTeacherUser.Id)
			if err != nil {
				fmt.Printf("查询应用组群中某个成员是否存在出错")
				c.JSON(http.StatusOK, gin.H{"code": 0, "message": "查询应用组群中某个成员是否存在出错"})
				return
			}
			TeacherPermission := 0
			if !exist_mem {
				err = AddStuAndTeacherToAppGroup(session, existTeacherUser.Id, AppGroup.No, TeacherPermission)
				if err != nil {
					fmt.Printf("添加用户到应用组群失败")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "添加用户到应用组群失败"})
					return
				}
				// 根据用户id和组群号查询用户权限
				/*_, groupPermission, err := models.GetUserPermission(session, AppGroup.No, existTeacherUser.Id)
				if err != nil {
					fmt.Printf("根据用户id和组群号查询用户权限出错")
					c.JSON(http.StatusOK, gin.H{"code": 0, "message": "根据用户id和组群号查询用户权限出错"})
					return
				}
				//判断老师权限是否为0,不为0则修改为0
				if groupPermission.Permission != 0 {
					groupPermission.Permission = 0
					_, err := models.UpdateAppGroupPermission(session, groupPermission)
					if err != nil {
						fmt.Printf("更新用户权限出错")
						c.JSON(http.StatusOK, gin.H{"code": 0, "message": "更新用户权限出错"})
						return
					}
				}*/

			}

		}

	}
	// 提交事务
	err = session.Commit()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": "提交事务失败!"})
		fmt.Println("提交事务失败")
		return
	}
	response := gin.H{
		"code":    1,
		"message": "班级负责人信息录入成功,创建组群成功",
	}

	// 序列化响应数据为 JSON 字符串
	jsonData, err := json.Marshal(response)
	if err != nil {
		// 处理序列化错误
		fmt.Println("序列化 JSON 数据出错:", err)
		return
	}
	fmt.Println("班级负责人信息录入成功,创建组群成功, Response:", string(jsonData))
	fmt.Println(config.ColorGreen, "班级负责人信息录入成功,创建组群成功", config.ColorReset)
	c.JSON(http.StatusOK, response)

}

/*
  输入学校(单位)编码,显示所属班级(部门)
*/
func QueryClassesBySchool(c *gin.Context) {
	//学校编号
	schoolNo := c.PostForm("schoolNo")
	classes, err := models.GetAllClassesBySchoolNo(schoolNo)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"code": 0, "message": " 根据学校编号查询所有班级信息出错"})
		fmt.Println("根据学校编号查询所有班级信息出错")
		return
	}
	response := gin.H{
		"code":    1,
		"message": "根据学校编号查询班级信息,创建组群成功",
		"classes": classes,
	}
	// 序列化响应数据为 JSON 字符串
	jsonData, err := json.Marshal(response)
	if err != nil {
		// 处理序列化错误
		fmt.Println("序列化 JSON 数据出错:", err)
		return
	}
	fmt.Println("根据学校编号查询班级信息,创建组群成功, Response:", string(jsonData))
	c.JSON(http.StatusOK, response)
}

//创建新的应用组群
func CreateNewAppGroup(session *xorm.Session, newGroupNo, groupName string, userid int64, permission int) error {
	/*应用组群操作*/
	// 生成组群号
	//newGroupNo = utils.GenerateInviteCode(Patriarch_user.Id)

	GroupMemIds := []int64{userid} // 创建一个包含id的数组
	appId := 6
	newGroup := &models.AppGroup{
		No:         newGroupNo,
		AppId:      int64(appId),
		CreatorId:  userid,
		GroupName:  groupName,
		GroupMem:   GroupMemIds,
		Visibility: "private",
	}
	// 在数据库中创建应用
	// 调用创建函数
	err := models.CreateAppGroup_Permission(session, newGroup, permission)
	if err != nil {
		fmt.Printf("Error creating app group: %s\n", err)

		return err
	}
	return nil
}

//添加学生到家长应用组群
func AddStuAndTeacherToAppGroup(session *xorm.Session, userid int64, newGroupNo string, permission int) error {

	bol, _, err := models.GetUserExistByID_Tx(session, userid)
	if err != nil {
		return err
	}
	if bol == false {
		return err
	}
	err = models.AppGroupInviteUser_Permission(session, newGroupNo, userid, permission)
	if err != nil {
		return err

	}

	return nil

}