package scheme

import (
	pcav1beta1 "github.com/cert-manager/aws-privateca-issuer/pkg/api/v1beta1"
	ackv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/ack/v1alpha1"
	alidnsv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/alidns/v1alpha1"
	ecsv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/ecs/v1alpha1"
	eipv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/eip/v1alpha1"
	alikmsv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/kms/v1alpha1"
	natv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/natgateway/v1alpha1"
	ossv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/oss/v1alpha1"
	plv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/privatelink/v1alpha1"
	pvtzv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/pvtz/v1alpha1"
	ramv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/ram/v1alpha1"
	slbv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/slb/v1alpha1"
	aliv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/v1alpha1"
	aliv1beta1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/v1beta1"
	alivpcv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/vpc/v1alpha1"
	certmanagerv1 "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1"
	operatorv1alpha1 "github.com/pingcap/tidb-operator/pkg/apis/pingcap/v1alpha1"
	ec2vv1beta1 "github.com/upbound/provider-aws/apis/ec2/v1beta1"
	awsupboundeksv1beta1 "github.com/upbound/provider-aws/apis/eks/v1beta1"
	awsupboundiamv1beta1 "github.com/upbound/provider-aws/apis/iam/v1beta1"
	kmsv1beta1 "github.com/upbound/provider-aws/apis/kms/v1beta1"
	route53v1beta1 "github.com/upbound/provider-aws/apis/route53/v1beta1"
	route53v1beta2 "github.com/upbound/provider-aws/apis/route53/v1beta2"
	awsupbounds3v1beta1 "github.com/upbound/provider-aws/apis/s3/v1beta1"
	awsupbounds3v1beta2 "github.com/upbound/provider-aws/apis/s3/v1beta2"
	awsupboundv1beta1 "github.com/upbound/provider-aws/apis/v1beta1"
	azureauthv1beta1 "github.com/upbound/provider-azure/apis/authorization/v1beta1"
	azurev1beta1 "github.com/upbound/provider-azure/apis/azure/v1beta1"
	azurecontainerv1beta1 "github.com/upbound/provider-azure/apis/containerservice/v1beta1"
	azuremanagedidentityv1beta1 "github.com/upbound/provider-azure/apis/managedidentity/v1beta1"
	azurenetworkv1beta1 "github.com/upbound/provider-azure/apis/network/v1beta1"
	azurestoragev1beta1 "github.com/upbound/provider-azure/apis/storage/v1beta1"
	azureapiv1beta1 "github.com/upbound/provider-azure/apis/v1beta1"
	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"
	_ "k8s.io/client-go/tools/clientcmd"
	_ "k8s.io/client-go/util/homedir"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	authv1alpha1 "github.com/tidbcloud/infra-provider/regional-server/pkg/ramauthenticator/apis/v1alpha1"
	o11yv2 "github.com/tidbcloud/observability/agent-control-server/api/v2"
)

var (
	Scheme = runtime.NewScheme()
	Codecs = serializer.NewCodecFactory(Scheme)
)

func init() {
	utilruntime.Must(clientgoscheme.AddToScheme(Scheme))
	utilruntime.Must(cloudv1.AddToScheme(Scheme))
	utilruntime.Must(v1alpha1.AddToScheme(Scheme))
	loadAWSUpboundScheme()
	loadAliScheme()
	loadAzureScheme()
	loadDataplaneScheme()
	loadO11ySchema() // TODO: remove it if use http API to create o11y agent
}

func loadAWSUpboundScheme() {
	utilruntime.Must(awsupboundiamv1beta1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(awsupboundeksv1beta1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(awsupboundv1beta1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(awsupbounds3v1beta1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(awsupbounds3v1beta2.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(kmsv1beta1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(route53v1beta1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(route53v1beta2.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(ec2vv1beta1.SchemeBuilder.AddToScheme(Scheme))
}

func loadAliScheme() {
	utilruntime.Must(aliv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(aliv1beta1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(ackv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(alivpcv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(ramv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(ossv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(natv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(eipv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(slbv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(ecsv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(authv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(alidnsv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(plv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(pvtzv1alpha1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(alikmsv1alpha1.SchemeBuilder.AddToScheme(Scheme))
}

func loadAzureScheme() {
	utilruntime.Must(azureapiv1beta1.SchemeBuilder.AddToScheme(Scheme))
	utilruntime.Must(azurev1beta1.AddToScheme(Scheme))
	utilruntime.Must(azurenetworkv1beta1.AddToScheme(Scheme))
	utilruntime.Must(azurecontainerv1beta1.AddToScheme(Scheme))
	utilruntime.Must(azureauthv1beta1.AddToScheme(Scheme))
	utilruntime.Must(azuremanagedidentityv1beta1.AddToScheme(Scheme))
	utilruntime.Must(azurestoragev1beta1.AddToScheme(Scheme))
}

func loadDataplaneScheme() {
	utilruntime.Must(certmanagerv1.AddToScheme(Scheme))
	utilruntime.Must(pcav1beta1.AddToScheme(Scheme))
	utilruntime.Must(operatorv1alpha1.AddToScheme(Scheme))
	utilruntime.Must(apiextensionsv1.AddToScheme(Scheme))
}

func loadO11ySchema() {
	utilruntime.Must(o11yv2.AddToScheme(Scheme))
}
