package task

import (
	"context"

	"github.com/tidbcloud/pov-service/internal/model"
	"github.com/tidbcloud/pov-service/internal/pkg/log"
)

// TestStartProcessor handles starting pending auto tests
type TestStartProcessor struct {
	BaseProcessor
	hooks []PhaseTransitionHook
}

func NewTestStartProcessor(
	manager *ProcessorManager,
	hooks ...PhaseTransitionHook,
) *TestStartProcessor {
	ret := &TestStartProcessor{BaseProcessor: BaseProcessor{manager}}
	ret.hooks = hooks
	return ret
}

func (p *TestStartProcessor) GetName() string {
	return "test-start"
}

func (p *TestStartProcessor) CanProcess(test model.WorkloadTest, taskPhase model.WorkloadTaskPhase) bool {
	return test.Status == model.ExecStatusPending &&
		test.Phase == model.WorkloadTestPhasePending &&
		test.IsAuto
}

func (p *TestStartProcessor) Process(ctx context.Context, test model.WorkloadTest) (model.WorkloadTest, error) {
	log.Log.Infof("Starting auto test %s", test.ID)
	defer func() {
		go func() {
			for _, hook := range p.hooks {
				if hook.Match(model.WorkloadTestPhasePending, test.Phase, test) {
					log.Log.Infof("Running test start hook %s for test %s", hook.GetName(), test.ID)
					err := hook.Do(ctx, test)
					if err != nil {
						log.Log.Errorf(err, "phase test start  hook %s failed", hook.GetName())
					}
				}
			}
		}()
	}()

	// Start the test
	test.OnStart()

	// Create the first task (CreateCluster) with pending phase
	task := model.WorkloadTask[any]{
		WorkloadTaskBase: model.WorkloadTaskBase{
			Typ:   model.WorkloadTaskTypeCreateCluster,
			Phase: model.WorkloadTaskPhasePending,
			ExecBase: model.ExecBase{
				Status: model.ExecStatusPending,
			},
		},
	}
	test.AppendTask(task)

	return test, nil
}
