package shadowpool

import (
	"context"

	openapiserverlessv1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/serverless/v1beta1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/repository"
)

const (
	defaultListPageSize      = 10
	maxListPageSize          = 100
	defaultMaxBatchSize      = 20
	defaultTimeToFreeInHours = 720
)

type Server interface {
	openapiserverlessv1beta1.ShadowPoolServiceServer
}

type serverImpl struct {
	poolRepo    repository.ShadowPoolRepository
	clusterRepo repository.ClusterRepository
}

func NewServer(poolRepo repository.ShadowPoolRepository, clusterRepo repository.ClusterRepository) Server {
	return &serverImpl{
		poolRepo:    poolRepo,
		clusterRepo: clusterRepo,
	}
}

func (s *serverImpl) CreateShadowPool(
	ctx context.Context,
	req *openapiserverlessv1beta1.CreateShadowPoolRequest,
) (*openapiserverlessv1beta1.ShadowPool, error) {
	return s.createShadowPool(ctx, req)
}

func (s *serverImpl) GetShadowPool(
	ctx context.Context,
	req *openapiserverlessv1beta1.GetShadowPoolRequest,
) (*openapiserverlessv1beta1.ShadowPool, error) {
	return s.getShadowPool(ctx, req)
}

func (s *serverImpl) ListShadowPools(
	ctx context.Context,
	req *openapiserverlessv1beta1.ListShadowPoolsRequest,
) (*openapiserverlessv1beta1.ListShadowPoolsResponse, error) {
	return s.listShadowPools(ctx, req)
}

func (s *serverImpl) DeleteShadowPool(
	ctx context.Context,
	req *openapiserverlessv1beta1.DeleteShadowPoolRequest,
) (*openapiserverlessv1beta1.DeleteShadowPoolResponse, error) {
	return s.deleteShadowPool(ctx, req)
}

func (s *serverImpl) UpdateShadowPool(
	ctx context.Context,
	req *openapiserverlessv1beta1.UpdateShadowPoolRequest,
) (*openapiserverlessv1beta1.ShadowPool, error) {
	return s.updateShadowPool(ctx, req)
}

func (s *serverImpl) ReplaceShadowPoolInitSqls(
	ctx context.Context,
	req *openapiserverlessv1beta1.ReplaceShadowPoolInitSqlsRequest,
) (*openapiserverlessv1beta1.ShadowPool, error) {
	return s.replaceShadowPoolInitSQLs(ctx, req)
}

func (s *serverImpl) ReplaceShadowPoolInstanceDemand(
	ctx context.Context,
	req *openapiserverlessv1beta1.ReplaceShadowPoolInstanceDemandRequest,
) (*openapiserverlessv1beta1.ShadowPool, error) {
	return s.replaceShadowPoolInstanceDemand(ctx, req)
}
