package engine

import (
	"github.com/pkg/errors"
	"go.uber.org/zap"
)

// Open opens all StorageEngine's components.
func (e *StorageEngine) Open() error {
	e.mtx.RLock()
	defer e.mtx.RUnlock()

	for id, sh := range e.shards {
		if err := sh.Open(); err != nil {
			return errors.Wrapf(err, "could not open shard %s", id)
		}
	}

	return nil
}

// Init initializes all StorageEngine's components.
func (e *StorageEngine) Init() error {
	e.mtx.RLock()
	defer e.mtx.RUnlock()

	for id, sh := range e.shards {
		if err := sh.Init(); err != nil {
			return errors.Wrapf(err, "could not initialize shard %s", id)
		}
	}

	return nil
}

// Close releases all StorageEngine's components.
func (e *StorageEngine) Close() error {
	e.mtx.RLock()
	defer e.mtx.RUnlock()

	for id, sh := range e.shards {
		if err := sh.Close(); err != nil {
			e.log.Debug("could not close shard",
				zap.String("id", id),
				zap.String("error", err.Error()),
			)
		}
	}

	return nil
}