package backfill

import (
	"github.com/prysmaticlabs/prysm/v5/beacon-chain/node"
	"github.com/prysmaticlabs/prysm/v5/beacon-chain/sync/backfill"
	"github.com/prysmaticlabs/prysm/v5/cmd/beacon-chain/sync/backfill/flags"
	"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives"
	"github.com/urfave/cli/v2"
)

// BeaconNodeOptions sets the appropriate functional opts on the *node.BeaconNode value, to decouple options
// from flag parsing.
func BeaconNodeOptions(c *cli.Context) ([]node.Option, error) {
	opt := func(node *node.BeaconNode) (err error) {
		bno := []backfill.ServiceOption{
			backfill.WithBatchSize(c.Uint64(flags.BackfillBatchSize.Name)),
			backfill.WithWorkerCount(c.Int(flags.BackfillWorkerCount.Name)),
			backfill.WithEnableBackfill(c.Bool(flags.EnableExperimentalBackfill.Name)),
		}
		// The zero value of this uint flag would be genesis, so we use IsSet to differentiate nil from zero case.
		if c.IsSet(flags.BackfillOldestSlot.Name) {
			uv := c.Uint64(flags.BackfillBatchSize.Name)
			bno = append(bno, backfill.WithMinimumSlot(primitives.Slot(uv)))
		}
		node.BackfillOpts = bno
		return nil
	}
	return []node.Option{opt}, nil
}
