package blobstor

import (
	"context"
	"sync/atomic"
	"time"

	"git.frostfs.info/TrueCloudLab/frostfs-observability/tracing"
	"golang.org/x/sync/errgroup"
)

// DumpInfo returns information about blob stor.
func (b *BlobStor) DumpInfo() Info {
	b.modeMtx.RLock()
	defer b.modeMtx.RUnlock()

	sub := make([]SubStorageInfo, len(b.storage))
	for i := range b.storage {
		sub[i].Path = b.storage[i].Storage.Path()
		sub[i].Type = b.storage[i].Storage.Type()
	}

	return Info{
		SubStorages: sub,
	}
}

// ObjectsCount returns Blobstore's total objects count.
func (b *BlobStor) ObjectsCount(ctx context.Context) (uint64, error) {
	var err error
	startedAt := time.Now()
	defer func() {
		b.metrics.ObjectsCount(time.Since(startedAt), err == nil)
	}()

	ctx, span := tracing.StartSpanFromContext(ctx, "BlobStor.ObjectsCount")
	defer span.End()

	b.modeMtx.RLock()
	defer b.modeMtx.RUnlock()

	var result atomic.Uint64

	eg, egCtx := errgroup.WithContext(ctx)
	for i := range b.storage {
		eg.Go(func() error {
			v, e := b.storage[i].Storage.ObjectsCount(egCtx)
			if e != nil {
				return e
			}
			result.Add(v)
			return nil
		})
	}

	if err = eg.Wait(); err != nil {
		return 0, err
	}

	return result.Load(), nil
}