package cmd

import (
	"context"
	"fmt"
	"strings"

	log_merger "github.com/pingcap-inc/alioth/merger"
	"github.com/pingcap/log"
	"github.com/spf13/cobra"
	"go.uber.org/zap"
)

var (
	CoverageInput  string
	CoverageOutput string
)

func NewMergeCmd() *cobra.Command {
	cmdScan := &cobra.Command{
		Use:   "merge",
		Short: "Merge multiple log coverage results",
		//Args:  cobra.MinimumNArgs(1),
		RunE: func(cmd *cobra.Command, args []string) error {
			if CoverageOutput == "" {
				CoverageOutput = "./logcoverage"
			}

			coverages := strings.Split(CoverageInput, ",")
			if len(coverages) <= 0 {
				return fmt.Errorf("log files don't exist")
			}

			MergeCoverage(CoverageOutput, coverages)
			return nil
		},
	}

	cmdScan.Flags().StringVar(&CoverageInput, "log-patterns", "", "the log pattern files, files are separated by commas")
	cmdScan.Flags().StringVar(&CoverageOutput, "output", "./logcoverage", "the merged log coverage file (contain log coverage, reference log code information)")
	cmdScan.MarkFlagRequired("log-patterns")
	return cmdScan
}

func MergeCoverage(storePath string, Coverges []string) {

	merger, err := log_merger.NewMerger(Coverges, storePath)
	if err != nil {
		log.Fatal("create merger failed", zap.Error(err))
	}

	merger.Merge(context.Background())
	if err != nil {
		log.Fatal("merge coverage failed", zap.Error(err))
	}
}
