package k8sresource

import (
	"context"

	regionalpb "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
	bizerr "github.com/tidbcloud/infra-provider/regional-server/pkg/common/errors"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers"
	"k8s.io/client-go/rest"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

// Service lists Kubernetes resources on the regional control plane or a data plane APPBox.
type Service struct {
	cpClient     client.Client
	cpAPIReader  client.Reader
	cpRestConfig *rest.Config
	dpManager    *controllers.Manager
}

func NewService(
	cpClient client.Client,
	cpAPIReader client.Reader,
	cpRestConfig *rest.Config,
	dpManager *controllers.Manager,
) *Service {
	return &Service{
		cpClient:     cpClient,
		cpAPIReader:  cpAPIReader,
		cpRestConfig: cpRestConfig,
		dpManager:    dpManager,
	}
}

func (s *Service) ListK8sResources(ctx context.Context, req *regionalpb.ListK8SResourcesRequest) (*regionalpb.ListK8SResourcesResponse, error) {
	if err := validateRequest(req); err != nil {
		return nil, err
	}
	switch req.PlaneType {
	case regionalpb.PlaneType_CONTROL_PLANE:
		return s.listControlPlane(ctx, req)
	case regionalpb.PlaneType_DATA_PLANE:
		return s.listDataPlane(ctx, req)
	default:
		return nil, bizerr.New(bizerr.ParameterInvalid, "unsupported plane_type")
	}
}
