package k8s

import (
	"context"
	"fmt"

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

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/provider"
)

var _ provider.ClusterReader = &Reader{}

type Reader struct {
	Cli   client.Client
	Cache client.Reader
}

func (r *Reader) GetClient(ctx context.Context, c *cloudv1.Cluster) (client.Client, error) {
	if c == nil {
		return nil, fmt.Errorf("empty cluster")
	}
	var network cloudv1.Network
	key := c.GetNetworkRef()
	if err := r.Cache.Get(ctx, key, &network); err != nil {
		return nil, fmt.Errorf("unable to get network %s: %v", c.Spec.NetworkName, err)
	}

	scheme, err := TiDBOperatorScheme()
	if err != nil {
		return nil, err
	}
	g, err := NetworkClientGetter(ctx, r.Cli, &network, scheme)
	if err != nil {
		return nil, err
	}
	return g.GetClient(ctx)
}

func (r *Reader) GetKubernetesStatus(c *cloudv1.Cluster) (*cloudv1.KubernetesStatus, error) {
	switch c.GetProviderType() {
	case cloudv1.ProviderTypeEKS:
		s, err := cloudv1.EKSClusterStatusFromCluster(c)
		if err != nil {
			return nil, err
		}
		return s.Kubernetes, nil
	case cloudv1.ProviderTypeGKE:
		s, err := cloudv1.GKEClusterStatusFromCluster(c)
		if err != nil {
			return nil, err
		}
		return s.Kubernetes, nil
	default:
		return nil, fmt.Errorf("unknown provider type %s", c.GetProviderType())
	}
}
