// package store_net -- реализация сетевого хранилища
package store_net

import (
	"fmt"

	"github.com/sirupsen/logrus"

	"wartank/pkg/types"
)

// StoreNet -- реализвция сетевого хранилища
type StoreNet struct {
	desktop types.IDesktop
	ws      types.IWebSocket
}

// NewStoreNet -- возвращает новый объект сетевого хранилища
func NewStoreNet(desktop types.IDesktop) (*StoreNet, error) {
	logrus.Infof("NewStoreNet()")
	if desktop == nil {
		return nil, fmt.Errorf("NewStoreNet(): IDesktop = =nil")
	}
	sf := &StoreNet{
		desktop: desktop,
		ws:      desktop.Ws(),
	}
	return sf, nil
}

// Find -- поиск объекта в хранилище
func (sf *StoreNet) Find(prefix string) (map[string]string, error) {
	logrus.Debugf("StoreNet.Find()")
	mapReq := make(map[string]string)
	mapReq["cmd"] = "/store/find"
	mapReq["key"] = prefix

	dictResp, err := sf.ws.Call("/store/find", mapReq)
	if err != nil {
		return nil, fmt.Errorf("StoreNet.Find(): in write StoreNet, err=\n\t%w", err)
	}
	strErr := dictResp["err"]
	if strErr != "" {
		return nil, fmt.Errorf("StoreNet.Find(): in response, err=\n\t%v", strErr)
	}
	return dictResp, nil
}

// Get -- получает содержимое записи по ключу
func (sf *StoreNet) Get(key string) (string, error) {
	logrus.Debugf("StoreNet.Get()")

	dictResp, err := sf.ws.Read(key)
	if err != nil {
		return "", fmt.Errorf("StoreNet.Get(): in read StoreNet, err=\n\t%w", err)
	}
	strErr := dictResp["err"]
	if string(strErr) != "" {
		return "", fmt.Errorf("StoreNet.Get(): in response, err=\n\t%v", strErr)
	}
	strResp := dictResp["res"]
	return strResp, nil
}

// Put -- помещает запись в хранилище
func (sf *StoreNet) Put(key string, val string) error {
	logrus.Debugf("StoreNet.Put()")
	dictReq := make(map[string]string)
	dictReq["key"] = key
	dictReq["val"] = val
	err := sf.ws.Write("/store/put", dictReq)
	if err != nil {
		return fmt.Errorf("StoreNet.Get(): in write StoreNet, err=\n\t%w", err)
	}
	return nil
}
