// Copyright (C) MongoDB, Inc. 2017-present.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

package driver

import (
	"errors"

	"github.com/mongodb/mongo-go-driver/bson"
	"github.com/mongodb/mongo-go-driver/bson/bsoncodec"
	"github.com/mongodb/mongo-go-driver/x/bsonx"
	"github.com/mongodb/mongo-go-driver/x/mongo/driver/session"
)

// ErrCollation is caused if a collation is given for an invalid server version.
var ErrCollation = errors.New("collation cannot be set for server versions < 3.4")

// ErrArrayFilters is caused if array filters are given for an invalid server version.
var ErrArrayFilters = errors.New("array filters cannot be set for server versions < 3.6")

func interfaceToDocument(val interface{}, registry *bsoncodec.Registry) (bsonx.Doc, error) {
	if val == nil {
		return bsonx.Doc{}, nil
	}

	if registry == nil {
		registry = bson.DefaultRegistry
	}

	if bs, ok := val.([]byte); ok {
		// Slight optimization so we'll just use MarshalBSON and not go through the codec machinery.
		val = bson.Raw(bs)
	}

	// TODO(skriptble): Use a pool of these instead.
	buf := make([]byte, 0, 256)
	b, err := bson.MarshalAppendWithRegistry(registry, buf, val)
	if err != nil {
		return nil, err
	}
	return bsonx.ReadDoc(b)
}

func interfaceToElement(key string, i interface{}, registry *bsoncodec.Registry) (bsonx.Elem, error) {
	switch conv := i.(type) {
	case string:
		return bsonx.Elem{key, bsonx.String(conv)}, nil
	case bsonx.Doc:
		return bsonx.Elem{key, bsonx.Document(conv)}, nil
	default:
		doc, err := interfaceToDocument(i, registry)
		if err != nil {
			return bsonx.Elem{}, err
		}

		return bsonx.Elem{key, bsonx.Document(doc)}, nil
	}
}

func closeImplicitSession(sess *session.Client) {
	if sess != nil && sess.SessionType == session.Implicit {
		sess.EndSession()
	}
}
