package test

import (
	"fmt"

	"github.com/juju/errors"
	"github.com/pingcap/schrodinger/config"
	"github.com/pingcap/schrodinger/manager/operator/proc/k8s"
	"github.com/pingcap/schrodinger/pkg/types"
	k8sv1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/api/resource"
)

var (
	errContextAborted = errors.New("aborted by context")
)

func createTestProc(testProc *types.TestProcess, namespace string) *k8s.Proc {
	envs := []k8sv1.EnvVar{
		{
			Name:  "MANAGER_ADDR",
			Value: fmt.Sprintf("http://%s:%d", config.GetGlobalConfig().Host, config.GetGlobalConfig().Port),
		},
		{
			Name:  "BOX_ID",
			Value: fmt.Sprintf("%d", testProc.BoxID),
		},
		{
			Name:  "EXPERIMENT_ID",
			Value: fmt.Sprintf("%d", testProc.ExperimentID),
		},
		{
			Name:  "TEST_ID",
			Value: fmt.Sprintf("%d", testProc.ID),
		},
	}

	testProc.Template.SetDefaultResourceConfig()

	resources := k8sv1.ResourceRequirements{
		Requests: k8sv1.ResourceList{
			k8sv1.ResourceCPU:    resource.MustParse(testProc.Template.ResourceConfig.Requests.CPU),
			k8sv1.ResourceMemory: resource.MustParse(testProc.Template.ResourceConfig.Requests.Memory),
		},
		Limits: k8sv1.ResourceList{
			k8sv1.ResourceCPU:    resource.MustParse(testProc.Template.ResourceConfig.Limits.CPU),
			k8sv1.ResourceMemory: resource.MustParse(testProc.Template.ResourceConfig.Limits.Memory),
		},
	}

	args := testProc.Template.Args
	// use override args as test case run-time args if it has been set
	if testProc.OverrideArgs != nil {
		args = *testProc.OverrideArgs
	}

	return k8s.New(namespace,
		testProc.Template.Name,
		testProc.Template.Source.BinaryName,
		testProc.Labels,
		testProc.Template.Source.URL,
		args,
		config.GetGlobalConfig().Agent.RestartLimit,
		config.GetGlobalConfig().Agent.RestartInterval,
		config.GetGlobalConfig().Agent.Timeout.Duration,
		envs,
		resources,
		testProc.Template.Source.Image)
}
