package mongo

import (
	"common/config"
	"common/log"
	"context"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

type DBName string

var clients = make(map[DBName]*mongo.Client)

func Init(cfg map[string]*config.MongoConfig) error {
	for name, oneConfig := range cfg {
		if client, err := initOneClient(oneConfig); err != nil {
			return err
		} else {
			clients[DBName(name)] = client
		}
	}
	return nil
}

func initOneClient(cfg *config.MongoConfig) (*mongo.Client, error) {
	opts := options.Client().
		ApplyURI(cfg.URI)

	client, err := mongo.Connect(context.Background(), opts)
	if err != nil {
		return nil, err
	}

	return client, nil
}

// GetClient 返回 mongo.Client，你可以通过 .Database("xxx") 获取具体数据库
func GetClient(dbName DBName) *mongo.Client {
	if c, ok := clients[dbName]; ok {
		return c
	}
	log.Errorf("mongo client %s not found", dbName)
	return nil
}

// GetDB 是便捷方法，直接返回 *mongo.Database（假设 dbName 对应数据库名）
// 如果你的配置中 dbName 和实际数据库名一致，可这样用
func GetDB(dbName DBName) *mongo.Database {
	client := GetClient(dbName)
	if client == nil {
		return nil
	}
	// 假设配置中的 key 就是数据库名；若需分离，可在 config 中加字段
	return client.Database(string(dbName))
}

func Close() error {
	if clients == nil {
		return nil
	}
	for name, client := range clients {
		if client != nil {
			if err := client.Disconnect(context.Background()); err != nil {
				log.Errorf("close mongo client %s error: %v", name, err)
			}
		}
	}
	return nil
}
