package branch

import (
	"os"
	"strings"

	"github.com/pingcap/errors"
	"github.com/tidbcloud/aws-shared-provider/pkg/types"
	"github.com/tidbcloud/aws-shared-provider/pkg/utils"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	corev1 "k8s.io/api/core/v1"
	"k8s.io/utils/ptr"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

const (
	defaultTiDBPort = 4000
)

func (r *reconcileContext) reconcileBranch() error {
	var reqErrs error
	if err := utils.IgnoreRequeue(&reqErrs, r.reconcileServerless()); err != nil {
		return err
	}

	if err := r.observeBranch(); err != nil {
		return err
	}
	return reqErrs
}

func (r *reconcileContext) genPublicEndpointStatus() (*cloudv1.SqlEndpointStatus, error) {
	gateway := &corev1.Service{}
	if err := r.Client.Get(
		r.ctx, client.ObjectKey{
			Name:      "tidb-gateway-new",
			Namespace: os.Getenv("NAMESPACE"),
		}, gateway,
	); err != nil {
		return nil, err
	}
	dnsName := gateway.Annotations[types.AnnoGatewayDnsName]
	if dnsName == "" {
		return nil, errors.New("can't found tidb-gateway service's dnsName")
	}

	return &cloudv1.SqlEndpointStatus{
		Host: dnsName,
		Port: defaultTiDBPort,
	}, nil
}

func (r *reconcileContext) genPrivatelinkStatus(
	specForProvider *types.InfraServerlessSpec,
) (*cloudv1.PrivateLinkServiceStatus, error) {
	privatelinkServiceConfig := "privatelink-service-config"
	if specForProvider.EnableZoneRedundant && r.ProviderType != types.ProviderTypeAliCloudFreeTier {
		privatelinkServiceConfig = "privatelink-zr-service-config"
	}

	privatelink := &corev1.ConfigMap{}
	if err := r.Client.Get(
		r.ctx, client.ObjectKey{
			Name:      privatelinkServiceConfig,
			Namespace: os.Getenv("NAMESPACE"),
		}, privatelink,
	); err != nil {
		return nil, err
	}

	return &cloudv1.PrivateLinkServiceStatus{
		Phase: cloudv1.PrivateLinkServicePhaseActive,
		AWS: &cloudv1.AWSPrivateLinkServiceStatus{
			AvailabilityZones: strings.Split(privatelink.Data["availability-zones"], ","),
			ServiceName:       privatelink.Data["service-name"],
			PrivateDNSName:    privatelink.Data["private-dns"],
			Port:              ptr.To[int32](defaultTiDBPort),
		},
	}, nil
}
