package aggregate

import (
	"github.com/pingcap/tidb/util/plancodec"

	"github.com/pingcap-inc/clinic/pkg/ngm/binaryplan"
	"github.com/pingcap-inc/clinic/pkg/ngm/statements/api"
	"github.com/pingcap-inc/clinic/pkg/ngm/statements/load"
)

func AggBinaryPlan() Aggregator {
	return &BinaryPlan{}
}

type BinaryPlan struct {
	v string
}

var _ Aggregator = (*BinaryPlan)(nil)

func (a *BinaryPlan) Add(record *load.StmtRecord) {
	if a.v == "" {
		a.v = record.SampleBinaryPlan
	}
}

func (a *BinaryPlan) Merge(agg Aggregator) {
	if agg, ok := agg.(*BinaryPlan); ok {
		if a.v == "" {
			a.v = agg.v
		}
	}
}

func (a *BinaryPlan) Output(model *api.Model) {
	model.BinaryPlan, _ = binaryplan.GenerateBinaryPlanJSON(a.v)
	model.BinaryPlanText, _ = plancodec.DecodeBinaryPlan(a.v)
}
