package store

import (
	"context"
)

// LogfFunc function used for Logf method
// type LogfFunc func(ctx context.Context, level Level, msg string, args ...interface{})
// type Wrapper interface {
//   Logf logs message with needed level
//   Logf(LogfFunc) LogfFunc
// }

// NamespaceStore wrap store with namespace
type NamespaceStore struct {
	s  Store
	ns string
}

var _ Store = &NamespaceStore{}

func NewNamespaceStore(s Store, ns string) Store {
	return &NamespaceStore{s: s, ns: ns}
}

func (w *NamespaceStore) Init(opts ...Option) error {
	return w.s.Init(opts...)
}

func (w *NamespaceStore) Connect(ctx context.Context) error {
	return w.s.Connect(ctx)
}

func (w *NamespaceStore) Disconnect(ctx context.Context) error {
	return w.s.Disconnect(ctx)
}

func (w *NamespaceStore) Read(ctx context.Context, key string, val interface{}, opts ...ReadOption) error {
	return w.s.Read(ctx, key, val, append(opts, ReadNamespace(w.ns))...)
}

func (w *NamespaceStore) Write(ctx context.Context, key string, val interface{}, opts ...WriteOption) error {
	return w.s.Write(ctx, key, val, append(opts, WriteNamespace(w.ns))...)
}

func (w *NamespaceStore) Delete(ctx context.Context, key string, opts ...DeleteOption) error {
	return w.s.Delete(ctx, key, append(opts, DeleteNamespace(w.ns))...)
}

func (w *NamespaceStore) Exists(ctx context.Context, key string, opts ...ExistsOption) error {
	return w.s.Exists(ctx, key, append(opts, ExistsNamespace(w.ns))...)
}

func (w *NamespaceStore) List(ctx context.Context, opts ...ListOption) ([]string, error) {
	return w.s.List(ctx, append(opts, ListNamespace(w.ns))...)
}

func (w *NamespaceStore) Options() Options {
	return w.s.Options()
}

func (w *NamespaceStore) Name() string {
	return w.s.Name()
}

func (w *NamespaceStore) String() string {
	return w.s.String()
}

func (w *NamespaceStore) Watch(ctx context.Context, opts ...WatchOption) (Watcher, error) {
	return w.s.Watch(ctx, opts...)
}

func (w *NamespaceStore) Live() bool {
	return w.s.Live()
}

func (w *NamespaceStore) Ready() bool {
	return w.s.Ready()
}

func (w *NamespaceStore) Health() bool {
	return w.s.Health()
}