package scheme

import (
	vpcv1beta1 "github.com/aws/amazon-vpc-resource-controller-k8s/apis/vpcresources/v1beta1"
	pcav1beta1 "github.com/cert-manager/aws-privateca-issuer/pkg/api/v1beta1"
	certmanagerv1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1"
	certmanagerv1alpha2 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1alpha2"
	opv1alpha1 "github.com/pingcap/tidb-operator/api/v2/core/v1alpha1"
	tiflowv1alpha1 "github.com/pingcap/tiflow-operator/api/v1alpha1"
	"github.com/tidbcloud/eks-provider/api/v1alpha1"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	agentv1 "github.com/tidbcloud/observability/agent-control-server/api/v1"
	apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/runtime/serializer"
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
)

var (
	// Scheme is used for both infra api and data plane
	Scheme = runtime.NewScheme()
	Codecs = serializer.NewCodecFactory(Scheme)
)

func init() {
	loadCommonScheme()
	loadDataplaneScheme()
}

func loadCommonScheme() {
	utilruntime.Must(clientgoscheme.AddToScheme(Scheme))
	utilruntime.Must(cloudv1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(v1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(agentv1.SchemeBuilder.AddToScheme(Scheme))
}

type addToSchemeFunc func(s *runtime.Scheme) error

func loadSchemes(schemeFuncs []addToSchemeFunc) {
	for _, f := range schemeFuncs {
		utilruntime.Must(f(Scheme))
	}
}

func loadDataplaneScheme() {
	schemeFuncs := []addToSchemeFunc{
		clientgoscheme.AddToScheme,
		opv1alpha1.Install,
		certmanagerv1alpha2.AddToScheme,
		certmanagerv1.AddToScheme,
		pcav1beta1.AddToScheme,
		tiflowv1alpha1.AddToScheme,
		apiextensionsv1.AddToScheme,
		vpcv1beta1.AddToScheme,
	}
	loadSchemes(schemeFuncs)
}
