package mongodbmgr

import (
	"server/conf"

	"github.com/name5566/leaf/db/mongodb"
	"github.com/name5566/leaf/log"

	// "gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
)

// 连接消息
var dialContext = new(mongodb.DialContext)

func init() {
	Connect()
	// test()
}
func Connect() {
	c, err := mongodb.Dial(conf.MongoDBAddr, 10)
	if err != nil {
		log.Error(err.Error())
		return
	}
	//defer c.Close()
	// index
	c.EnsureUniqueIndex(conf.MongoDBName, "login", []string{"user_id"})
	log.Release("mongodb Connect success")
	dialContext = c
}

// Collection 定义集合操作接口
type Collection struct {
	DB         string
	Collection string
}

// NewCollection 创建集合操作实例
func NewCollection(db, collection string) *Collection {
	return &Collection{
		DB:         db,
		Collection: collection,
	}
}

// Insert 插入文档
func (c *Collection) Insert(doc interface{}) error {
	s := dialContext.Ref()
	defer dialContext.UnRef(s)

	return s.DB(c.DB).C(c.Collection).Insert(doc)
}

// Delete 删除文档
func (c *Collection) Delete(query bson.M) error {
	s := dialContext.Ref()
	defer dialContext.UnRef(s)

	return s.DB(c.DB).C(c.Collection).Remove(query)
}

// Update 更新文档
func (c *Collection) Update(query bson.M, update bson.M) error {
	s := dialContext.Ref()
	defer dialContext.UnRef(s)

	return s.DB(c.DB).C(c.Collection).Update(query, bson.M{"$set": update})
}

// FindOne 查询单个文档
func (c *Collection) FindOne(query bson.M, result interface{}) error {
	s := dialContext.Ref()
	defer dialContext.UnRef(s)

	return s.DB(c.DB).C(c.Collection).Find(query).One(result)
}

// FindMany 查询多个文档
func (c *Collection) FindMany(query bson.M, skip, limit int, result interface{}) error {
	s := dialContext.Ref()
	defer dialContext.UnRef(s)

	return s.DB(c.DB).C(c.Collection).Find(query).Skip(skip).Limit(limit).All(result)
}

// func test() {
// 	// 1. 用户集合操作
// 	type User struct {
// 		UserID   int64  `bson:"user_id"`
// 		Name     string `bson:"name"`
// 		Password string `bson:"password"`
// 	}

// 	userColl := NewCollection(conf.MongoDBName, "users")

// 	// 插入用户
// 	user := &User{UserID: 1001, Name: "player1"}
// 	err := userColl.Insert(user)
// 	if err != nil {
// 		log.Error(err.Error())
// 	}

// 	// 查询用户
// 	findUser := new(User)
// 	err = userColl.FindOne(bson.M{"user_id": 1001}, findUser)

// 	if err != nil {
// 		log.Error(err.Error())
// 	}
// 	// 2. 游戏记录集合操作
// 	type GameRecord struct {
// 		GameID    int64   `bson:"game_id"`
// 		Players   []int64 `bson:"players"`
// 		CreatedAt int64   `bson:"created_at"`
// 	}

// 	gameColl := NewCollection("teen_patti", "game_records")

// 	// 插入游戏记录
// 	record := &GameRecord{
// 		GameID:    1,
// 		Players:   []int64{1001, 1002},
// 		CreatedAt: time.Now().Unix(),
// 	}
// 	err = gameColl.Insert(record)
// 	if err != nil {
// 		log.Error(err.Error())
// 	}

// 	// 查询游戏记录列表
// 	var records []GameRecord
// 	err = gameColl.FindMany(
// 		bson.M{"players": 1001},
// 		0,
// 		10,
// 		&records,
// 	)
// 	if err != nil {
// 		log.Error(err.Error())
// 	}
// 	log.Error("records:", records)
// }
