package log_merger

import (
	"context"

	"github.com/pingcap/log"
	"go.uber.org/zap"
)

type Merger struct {
	//  multiple coverages and unknownLogs need to be merged
	sources map[string]*mergeStore

	// merged coverage and unknownLog
	target *mergeStore
}

func NewMerger(paths []string, output string) (*Merger, error) {
	target, err := newMergeStore(output)
	if err != nil {
		return nil, err
	}

	m := &Merger{
		sources: make(map[string]*mergeStore),
		target:  target,
	}

	for _, path := range paths {
		store, err := newMergeStore(path)
		if err != nil {
			return nil, err
		}
		m.sources[path] = store
	}

	return m, nil
}

func (m *Merger) Close(ctx context.Context) error {
	for path, store := range m.sources {
		if err := store.Close(ctx); err != nil {
			log.Error("close store failed", zap.String("path", path), zap.Error(err))

		}
	}

	return m.target.Close(ctx)
}

// Merge source stores one by one
func (m *Merger) Merge(ctx context.Context) error {
	if len(m.sources) <= 0 {
		return nil
	}

	for path, source := range m.sources {
		if err := source.Foreach(ctx, m.target); err != nil {
			log.Error("merge failed", zap.String("path", path), zap.Error(err))
			return err
		}
	}

	return m.target.Flush(ctx)
}
