package writecache

import (
	"context"

	"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/local_object_storage/shard/mode"
	"git.frostfs.info/TrueCloudLab/frostfs-observability/tracing"
	"go.opentelemetry.io/otel/attribute"
	"go.opentelemetry.io/otel/trace"
)

func (c *cache) Seal(ctx context.Context, prm SealPrm) error {
	ctx, span := tracing.StartSpanFromContext(ctx, "writecache.Seal",
		trace.WithAttributes(
			attribute.Bool("ignore_errors", prm.IgnoreErrors),
			attribute.Bool("restore_mode", prm.RestoreMode),
		))
	defer span.End()

	c.modeMtx.Lock()
	defer c.modeMtx.Unlock()

	sourceMode := c.mode
	// flush will be done by setMode
	err := c.setMode(ctx, mode.DegradedReadOnly, setModePrm{ignoreErrors: prm.IgnoreErrors, shrink: prm.Shrink})
	if err != nil {
		return err
	}
	c.metrics.SetMode(mode.ComponentDisabled)
	if prm.RestoreMode {
		err = c.setMode(ctx, sourceMode, setModePrm{ignoreErrors: prm.IgnoreErrors})
		if err == nil {
			c.metrics.SetMode(mode.ConvertToComponentMode(sourceMode))
		}
	}
	return err
}