package db

import (
	"context"
	"time"

	"go.mongodb.org/mongo-driver/v2/mongo"
	"go.mongodb.org/mongo-driver/v2/mongo/options"
)

// Client wraps the mongo client and exposes typed collection accessors.
type Client struct {
	client *mongo.Client
	db     *mongo.Database
}

func Connect(ctx context.Context, uri string) (*Client, error) {
	opts := options.Client().ApplyURI(uri)
	c, err := mongo.Connect(opts)
	if err != nil {
		return nil, err
	}

	pingCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
	defer cancel()
	if err := c.Ping(pingCtx, nil); err != nil {
		return nil, err
	}

	return &Client{client: c, db: c.Database("logjensticks")}, nil
}

func (c *Client) Disconnect(ctx context.Context) error {
	return c.client.Disconnect(ctx)
}

func (c *Client) Users() *mongo.Collection {
	return c.db.Collection("users")
}

func (c *Client) Sessions() *mongo.Collection {
	return c.db.Collection("sessions")
}

func (c *Client) Lanes() *mongo.Collection {
	return c.db.Collection("lanes")
}
