package main

import (
	"fmt"
	"gorm.io/gorm"
	"log"
)
import "gorm.io/driver/mysql"

type User struct {
	gorm.Model
	Name  string
	Roles []Role `gorm:"many2many:user_roles;"` // 多对多关系
}

type Role struct {
	gorm.Model
	Name  string
	Users []User `gorm:"many2many:user_roles;"` // 多对多关系
}

func createUserAndRoles(db *gorm.DB) {
	// 创建角色
	adminRole := Role{Name: "Admin"}
	userRole := Role{Name: "User"}
	db.Create(&adminRole)
	db.Create(&userRole)

	// 创建用户并关联角色
	user := User{
		Name:  "meowrain",
		Roles: []Role{adminRole, userRole}, // 关联多个角色
	}
	db.Create(&user)

	fmt.Println("User and roles created successfully!")
}

func queryUserAndRoles(db *gorm.DB) {
	var user User
	db.Preload("Roles").First(&user, 1) // 查询 ID 为 1 的用户及其角色
	fmt.Println("User:", user.Name)
	for _, role := range user.Roles {
		fmt.Println("Role:", role.Name)
	}
}
func updateUserRoles(db *gorm.DB) {
	var user User
	db.Preload("Roles").First(&user, 1) // 查询 ID 为 1 的用户及其角色

	// 创建新角色
	newRole := Role{Name: "Editor"}
	db.Create(&newRole)

	// 更新用户的角色
	user.Roles = []Role{newRole} // 替换用户的角色
	db.Save(&user)

	fmt.Println("User roles updated successfully!")
}
func deleteUserAndRoles(db *gorm.DB) {
	var user User
	db.Preload("Roles").First(&user, 1) // 查询 ID 为 1 的用户及其角色

	// 删除用户及其关联的角色
	db.Select("Roles").Delete(&user)

	fmt.Println("User and roles deleted successfully!")
}
func main() {
	dsn := mysql.Open("root:123456@tcp(127.0.0.1:3306)/mybatis_learn?charset=utf8&parseTime=True&loc=Local")
	db, err := gorm.Open(dsn, &gorm.Config{})
	if err != nil {
		log.Println(err)
		return
	}
	err = db.AutoMigrate(&User{}, &Role{})
	if err != nil {
		log.Fatalln("Failed to migrate tables: ", err)
	}
	fmt.Println("Database migrated")
	createUserAndRoles(db)
}