package connector_inbound

import (
	"fmt"

	connector_inbound_routing "github.com/pingcap-inc/nexuscrm-connectors/features/connector/inboundrouting"
)

// newWorkerForTest retains the retired Event/split-claim construction path only
// for in-package unit tests. Production code has no public constructor for it.
func newWorkerForTest(
	cfg WorkerConfig,
	events EventsService,
	syncstate SyncStateService,
	batchRead BatchReadClient,
	flow FlowInvoker,
	resolver connector_inbound_routing.RouteResolver,
) (*Worker, error) {
	if events == nil {
		return nil, fmt.Errorf("%w: events is nil", ErrInvalidWorkerConfig)
	}
	var err error
	cfg, err = normalizeWorkerConfig(cfg, syncstate, batchRead, flow, resolver)
	if err != nil {
		return nil, err
	}
	claimPath := normalizeClaimPath(cfg.ClaimPath)
	if err := validateClaimPathConfig(cfg, claimPath); err != nil {
		return nil, err
	}
	cfg.ClaimPath = claimPath
	if claimPath == ClaimPathWorkItem {
		if err := validateConsolidatedWorkItemClaimInputs(events, cfg); err != nil {
			return nil, err
		}
		if cfg.WorkItemEventBridge == nil {
			bridge, ok := events.(WorkItemEventBridge)
			if !ok {
				return nil, fmt.Errorf("%w: WorkItemEventBridge is required for work_item claim path", ErrInvalidWorkerConfig)
			}
			cfg.WorkItemEventBridge = bridge
		}
		events = newWorkItemEventsService(events, cfg)
	}
	return buildWorker(cfg, events, syncstate, batchRead, flow, resolver), nil
}

func newWorkerForTestWithNoopBatchRead(
	cfg WorkerConfig,
	events EventsService,
	syncstate SyncStateService,
	batchRead BatchReadClient,
	flow FlowInvoker,
	resolver connector_inbound_routing.RouteResolver,
) (*Worker, error) {
	if batchRead == nil {
		batchRead = noopBatchReadClient{}
	}
	return newWorkerForTest(cfg, events, syncstate, batchRead, flow, resolver)
}
