package sharedpool

import (
	"context"
	"errors"
	"fmt"

	"github.com/tidbcloud/cluster-service-ng/domain/entity"
	"github.com/tidbcloud/cluster-service-ng/pkg/storage/mysql/schema"
	"github.com/tidbcloud/cluster-service-ng/pkg/storage/repo"
	"github.com/tidbcloud/pkgv2/db"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
	"google.golang.org/protobuf/encoding/protojson"
	"gorm.io/gorm"
)

type dataplaneRepoImpl struct {
	provider db.Provider
}

func Newk8sDataplaneRepo(provider db.Provider) repo.DataplaneRepo {
	return &dataplaneRepoImpl{
		provider: provider,
	}
}

func (d *dataplaneRepoImpl) LoadByName(ctx context.Context, name string) (*entity.DataPlaneProvider, error) {
	var dataPlaneProvider entity.DataPlaneProvider
	rdb := d.provider.ReadDB(ctx)

	var dataplaneInfoStr string
	if err := rdb.Model(&schema.SharedPool{}).Where("dataplane_name = ?", name).
		Select("dataplane_info").First(&dataplaneInfoStr).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, status.Errorf(codes.NotFound, "dataplane with name %s not found", name)
		}
		return nil, err // Other errors
	}
	// Unmarshal the dataplane info
	if dataplaneInfoStr == "" {
		return nil, status.Errorf(codes.NotFound, "dataplane info for %s is empty", name)
	}

	if err := protojson.Unmarshal([]byte(dataplaneInfoStr), &dataPlaneProvider); err != nil {
		return nil, fmt.Errorf("failed to unmarshal dataplane info: %w", err)
	}

	return &dataPlaneProvider, nil
}
