package control

import (
	"context"

	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/engine"
	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control"
	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/control/server/ctrlmessage"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

func (s *Server) SealWriteCache(ctx context.Context, req *control.SealWriteCacheRequest) (*control.SealWriteCacheResponse, error) {
	err := s.isValidRequest(req)
	if err != nil {
		return nil, status.Error(codes.PermissionDenied, err.Error())
	}

	prm := engine.SealWriteCachePrm{
		ShardIDs:     s.getShardIDList(req.GetBody().GetShard_ID()),
		IgnoreErrors: req.GetBody().GetIgnoreErrors(),
	}

	res, err := s.s.SealWriteCache(ctx, prm)
	if err != nil {
		return nil, status.Error(codes.Internal, err.Error())
	}

	resp := &control.SealWriteCacheResponse{Body: &control.SealWriteCacheResponse_Body{}}
	for _, r := range res.ShardResults {
		if r.Success {
			resp.Body.Results = append(resp.GetBody().GetResults(), &control.SealWriteCacheResponse_Body_Status{
				Shard_ID: *r.ShardID,
				Success:  true,
			})
		} else {
			resp.Body.Results = append(resp.GetBody().GetResults(), &control.SealWriteCacheResponse_Body_Status{
				Shard_ID: *r.ShardID,
				Error:    r.ErrorMsg,
			})
		}
	}

	err = ctrlmessage.Sign(s.key, resp)
	if err != nil {
		return nil, err
	}
	return resp, nil
}