package cluster

import (
	"context"

	"github.com/go-logr/logr"
	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/tidbcloud/eks-provider/api/v1alpha1"
	tiflowConf "github.com/tidbcloud/eks-provider/controllers/tiflow/config"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/cloud/gcp"
	compatk8s "github.com/tidbcloud/infra-provider/pkg/compat/k8s/dataplane"
	"github.com/tidbcloud/infra-provider/pkg/config"
	"github.com/tidbcloud/infra-provider/pkg/gitops"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
	"github.com/tidbcloud/infra-provider/pkg/namer"
	"github.com/tidbcloud/infra-provider/pkg/procedure"
)

type BaseContextGetter interface {
	GetBaseContext() *BaseContext
}

type BaseContext struct {
	Remote k8s.ClientGetter // nolint:structcheck

	// Injected from the caller
	Logger logr.Logger
	Local  client.Client

	Config config.RootConfig
	Namer  *namer.TiflowNamer

	AWSSVC procedure.AWSService

	TiflowSpec *v1alpha1.TiflowSpec

	Network       *cloudv1.Network
	Provider      gitops.Provider
	ClusterConfig *tiflowConf.ClusterConfig
	GCP           gcp.Client
}

func (c *BaseContext) SetRemoteClient(ctx context.Context) error {
	scheme, err := k8s.TiflowOperatorScheme()
	if err != nil {
		return err
	}
	g, err := compatk8s.NetworkClientGetter(ctx, c.Local, c.Network, scheme)
	if err != nil {
		return err
	}
	c.Remote = k8s.NewCacheClientGetter(g)
	return nil
}
