package provider

import (
	"context"
	"os"
	"time"

	"sigs.k8s.io/controller-runtime/pkg/client"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-api/controllers/utils"
	"github.com/tidbcloud/infra-api/pkg/consts"
	"github.com/tidbcloud/infra-api/pkg/nodegroup"
)

var _ Cdc = new(GardenerCDCProvider)

type GardenerCDCProvider struct {
}

func NewGardenerCDCProvider() Cdc {
	return &GardenerCDCProvider{}
}

func (c *GardenerCDCProvider) GetCdcUpstreamClient(context.Context, *cloudv1.TiCDC) (client.Client, error) {
	return nil, errUnimplemented
}

func (c *GardenerCDCProvider) GetCdcClient(context.Context, *cloudv1.Network) (client.Client, error) {
	return nil, errUnimplemented
}

func (c *GardenerCDCProvider) GetCdcKubernetesStatus(*cloudv1.Cluster) (*cloudv1.KubernetesStatus, error) {
	return nil, errUnimplemented
}

func (c *GardenerCDCProvider) CreateCdcNodeGroup(ctx context.Context, network *cloudv1.TiCDC, ngs *nodegroup.Set) (map[string]string, error) {
	// do nothing
	if utils.InIntegrationTest() {
		os.Setenv("CreateCdcNodeGroup", "true")
	}
	return map[string]string{}, nil
}

func (c *GardenerCDCProvider) DeleteCdcNodeGroup(ctx context.Context, network *cloudv1.TiCDC, ngs *nodegroup.Set) error {
	// do nothing
	if utils.InIntegrationTest() {
		os.Setenv("DeleteCdcNodeGroup", "true")
	}
	return nil
}

func (c *GardenerCDCProvider) RequireV1CertManager() bool {
	return false
}

func (c *GardenerCDCProvider) CertificateOptions() (kind string, name string, d time.Duration) {
	return consts.AwsPcaIssuerKind, consts.AwsPcaIssuer, consts.CertificateDuration
}

func (c *GardenerCDCProvider) OverrideImage(cluster *cloudv1.Cluster, imageName string) string {
	return imageName
}

func (c *GardenerCDCProvider) GetNetworkProxyBaseURL(_ context.Context, network *cloudv1.Network) (string, error) {
	networkStatus, err := cloudv1.GardenerNetworkStatusFromNetwork(network)
	if err != nil {
		return "", err
	}
	return networkStatus.ProxyBaseUrl, nil
}
