package task

import (
	"context"
	"fmt"
	"time"

	"github.com/go-logr/logr"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	regionalpb "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	cdcv1 "github.com/tidbcloud/ticdc-service/api/v1"
	"github.com/tidbcloud/ticdc-service/pkg/cloud"
	"k8s.io/client-go/tools/record"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

const (
	Finalizer = "ticdc.cloud.pingcap.com/finalizer"
)

type Context struct {
	Recorder record.EventRecorder
	Logger   logr.Logger
	Env      string // used to tag cloud resources

	Local        client.Client       // controlplane k8s client
	SinkEndpoint *cdcv1.SinkEndpoint // controlplane endpoint CR
	AppBox       *regionalpb.APPBox

	CloudProvider cloud.Provider

	beginAt *time.Time
}

type baseTask struct {
	*Context
}

func (t *baseTask) Name() string {
	return "Base"
}

func (t *baseTask) Category() deploy.TaskCategory {
	return deploy.TiCDCSinkEndpointTask
}

func (t *baseTask) Create(ctx context.Context) deploy.Result {
	return deploy.Done()
}

func (t *baseTask) PostCreate(ctx context.Context) deploy.Result {
	return deploy.Done()
}

func (t *baseTask) Delete(ctx context.Context) deploy.Result {
	return deploy.Done()
}

func (t *baseTask) PostDelete(ctx context.Context) deploy.Result {
	return deploy.Done()
}

// MetricsStartTime will return the `BeginAt` (nil by default). For
// Task whose metrics need to be exported, the `BeginAt` should be
// initialized when the `Create` is being called.
func (t *baseTask) MetricsStartTime() *time.Time {
	return t.beginAt
}

// helper functions to generate CR names based on CDC CR
// nolint:unused
func (t *baseTask) getProviderConfigName() string {
	return fmt.Sprintf("sinpoint-%s", t.SinkEndpoint.Name)
}

// nolint:unused
func (t *baseTask) getProjectID() string {
	return t.SinkEndpoint.Labels[cloudv1.ProjectTagKey]
}

// nolint:unused
func (t *baseTask) getTenantID() string {
	return t.SinkEndpoint.Labels[cloudv1.TenantTagKey]
}
