package storage

import (
	"context"
	"time"

	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.uber.org/zap"
)

type Database struct {
	Database *mongo.Database
	client   *mongo.Client
}

// New connects to DB and returns a client that will disconnect when the passed in context is cancelled
func New(appCtx context.Context, log *zap.Logger, uri, databaseName string) (*Database, error) {
	cli, err := mongo.Connect(appCtx, options.Client().ApplyURI(uri))
	if err != nil {
		return nil, err
	}
	return &Database{client: cli, Database: cli.Database(databaseName)}, err
}

// Close closes the database connections.
func (d *Database) Close() error {
	ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(30*time.Second))
	return d.client.Disconnect(ctx)
}
