package putsvc

import (
	"context"

	objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/transformer"
)

var _ transformer.ChunkedObjectWriter = (*inMemoryObjectBuilder)(nil)

type inMemoryObjectBuilder struct {
	objectWriter transformer.ObjectWriter
	payload      *payload

	obj *objectSDK.Object
}

func newInMemoryObjectBuilder(objectWriter transformer.ObjectWriter) *inMemoryObjectBuilder {
	return &inMemoryObjectBuilder{
		objectWriter: objectWriter,
		payload:      getPayload(),
	}
}

func (b *inMemoryObjectBuilder) Close(ctx context.Context) (*transformer.AccessIdentifiers, error) {
	defer func() {
		putPayload(b.payload)
		b.payload = nil
	}()

	b.obj.SetPayload(b.payload.Data)

	if err := b.objectWriter.WriteObject(ctx, b.obj); err != nil {
		return nil, err
	}

	id, _ := b.obj.ID()
	return &transformer.AccessIdentifiers{
		SelfID: id,
	}, nil
}

func (b *inMemoryObjectBuilder) Write(_ context.Context, p []byte) (int, error) {
	b.payload.Data = append(b.payload.Data, p...)

	return len(p), nil
}

func (b *inMemoryObjectBuilder) WriteHeader(_ context.Context, obj *objectSDK.Object) error {
	b.obj = obj

	return nil
}