package patchsvc

import (
	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object"
	getsvc "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/get"
	putsvc "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/put"
	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/util"
)

// Service implements Put operation of Object service v2.
type Service struct {
	keyStorage *util.KeyStorage

	getSvc *getsvc.Service

	putSvc *putsvc.Service
}

// NewService constructs Service instance from provided options.
func NewService(ks *util.KeyStorage, getSvc *getsvc.Service, putSvc *putsvc.Service) *Service {
	return &Service{
		keyStorage: ks,

		getSvc: getSvc,

		putSvc: putSvc,
	}
}

// Put calls internal service and returns v2 object streamer.
func (s *Service) Patch() (object.PatchObjectStream, error) {
	nodeKey, err := s.keyStorage.GetKey(nil)
	if err != nil {
		return nil, err
	}

	return &Streamer{
		getSvc: s.getSvc,

		putSvc: s.putSvc,

		localNodeKey: nodeKey,
	}, nil
}