package db

import (
	"context"
	"fmt"
	"github.com/stretchr/testify/assert"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"leaf/log"
	"testing"
	"time"
)

var pool *MongoPool

// 测试主函数
func TestMongoDB(t *testing.T) {

	// 创建MongoPool实例
	conf := MongoConfig{
		Host:     "192.168.12.166",
		Port:     27017,
		Username: "",
		Password: "",
	}

	pool = &MongoPool{}
	pool.Init(conf, 5, 5*time.Second)

	// 获取 MongoDB 客户端（同步模式）
	//client, err := pool.GetClient(true) // true表示同步获取
	//if err != nil {
	//	log.Fatal("Error getting MongoDB client: %v", err)
	//}
	// 使用 client 执行操作...

	// 获取 MongoDB 客户端（异步模式）
	client, err := pool.GetClient(false) // false表示异步获取
	if err != nil {
		log.Fatal("Error getting MongoDB client: %v", err)
	}
	// 使用 client 执行操作...

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	// 清理数据库中的数据
	db := client.Database("TestGame")
	col := db.Collection("users")
	_, err = col.DeleteMany(ctx, bson.M{}) // 清空数据
	if err != nil {
		t.Fatalf("清理数据失败: %v", err)
	}

	// 插入单个文档
	user := bson.M{
		"name":  "John Doe",
		"email": "john@example.com",
		"age":   30,
	}
	_, err = col.InsertOne(ctx, user)
	assert.NoError(t, err, "插入单个文档失败")
	//assert.NotNil(t, user["_id"], "文档应包含 _id 字段")

	// 插入多个文档
	users := []interface{}{
		bson.M{"name": "Alice", "email": "alice@example.com", "age": 25},
		bson.M{"name": "Bob", "email": "bob@example.com", "age": 35},
	}
	res1, err := col.InsertMany(ctx, users)
	assert.NoError(t, err, "插入多个文档失败")
	fmt.Printf("插入的 ID 为: %v\n", res1.InsertedIDs)

	// 查询单个文档
	var result bson.M
	err = col.FindOne(ctx, bson.M{"name": "John Doe"}).Decode(&result)
	assert.NoError(t, err, "查询单个文档失败")
	assert.Equal(t, "John Doe", result["name"], "查询结果不匹配")

	// 更新文档
	filter := bson.M{"name": "John Doe"}
	update := bson.M{"$set": bson.M{"age": 31}}
	_, err = col.UpdateOne(ctx, filter, update)
	assert.NoError(t, err, "更新文档失败")

	// 验证更新
	err = col.FindOne(ctx, filter).Decode(&result)
	assert.NoError(t, err, "查询更新后文档失败")
	assert.Equal(t, int32(31), result["age"], "更新未生效")

	// 删除文档
	_, err = col.DeleteOne(ctx, bson.M{"name": "Bob"})
	assert.NoError(t, err, "删除文档失败")

	// 验证删除
	err = col.FindOne(ctx, bson.M{"name": "Bob"}).Decode(&result)
	assert.Equal(t, mongo.ErrNoDocuments, err, "文档应已被删除")

	//创建选项，如果文档不存在就插入文档
	opts := options.Update().SetUpsert(true)
	filter1 := bson.D{{Key: "a", Value: 88}}

	//inc是加  对c的值加222
	//update := bson.D{{Key: "$inc", Value: bson.D{{Key: "c", Value: 222}}}}
	//set是设置 把c的值设置成222
	update1 := bson.D{{Key: "$set", Value: bson.D{{Key: "c", Value: 666}}}}

	//更新单个文档
	// res, err := collection.UpdateOne(ctx, filter, update, opts)
	//更新所有的文档
	res, err := col.UpdateMany(ctx, filter1, update1, opts)
	if err != nil {
		fmt.Println(err)
		return
	}
	//分别打印匹配到的个数   修改的个数   插入的个数    插入的id
	fmt.Println(res.MatchedCount, res.ModifiedCount, res.UpsertedCount, res.UpsertedID)

	// 关闭连接池
	defer pool.Disconnect()

	// close
	//c := make(chan os.Signal, 1)
	//signal.Notify(c, os.Interrupt, os.Kill)
	//sig := <-c
	//log.Release("main closing down (signal: %v)", sig)
}
