package client

import (
	"io"
	"sync"

	"github.com/nspcc-dev/neofs-api-go/rpc/client"
)

// Client represents NeoFS client.
type Client interface {
	Accounting
	Container
	Netmap
	Object
	Session
	Reputation

	// Raw must return underlying raw protobuf client.
	Raw() *client.Client

	// Conn must return underlying connection.
	//
	// Must return a non-nil result after the first RPC call
	// completed without a connection error.
	Conn() io.Closer
}

type clientImpl struct {
	onceInit sync.Once

	raw *client.Client

	opts *clientOptions
}

func New(opts ...Option) (Client, error) {
	clientOptions := defaultClientOptions()

	for i := range opts {
		opts[i](clientOptions)
	}

	return &clientImpl{
		opts: clientOptions,
	}, nil
}