package cluster

import (
	"context"
	"fmt"

	"braces.dev/errtrace"

	globaldedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
)

func (svc *service) GetComponentNodeInfo(
	ctx context.Context,
	clusterId uint64,
) (*globaldedicatedv1.ComponentNodeInfo, error) {
	ctx, span := tracer.Start(ctx, "ClusterService.GetComponentNodeInfo")
	defer span.End()

	var nodeInfo *globaldedicatedv1.ComponentNodeInfo

	if clusterId == 0 {
		return nil, fmt.Errorf("cluster id is invalid")
	}

	if err := svc.transaction.Transaction(ctx, func(ctx context.Context) error {
		var err error
		// First make sure cluster exists in database
		cluster, err := svc.clusterRepo.GetCluster(ctx, clusterId, false)
		if err != nil {
			return fmt.Errorf("failed to find cluster in database: %w", err)
		}

		if cluster.DeployType != entity.DeployTypeDedicated {
			return fmt.Errorf("cluster is not a dedicated cluster")
		}

		resp, err := svc.dedicatedCli.GetComponentNodeInfo(ctx, &globaldedicatedv1.GetComponentNodeInfoRequest{ClusterId: clusterId})
		if err != nil {
			return errtrace.Wrap(err)
		}

		if resp.ComponentNodeInfo == nil {
			return fmt.Errorf("node info object should not be nil")
		}

		nodeInfo = resp.ComponentNodeInfo

		return nil
	}); err != nil {
		return nodeInfo, errtrace.Wrap(err)
	}

	return nodeInfo, nil
}
