package cloud

import (
	"context"
	"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
	"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
	"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models"
	"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
	"strconv"

	"github.com/zeromicro/go-zero/core/logx"
)

type RegisterClusterLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewRegisterClusterLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RegisterClusterLogic {
	return &RegisterClusterLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *RegisterClusterLogic) RegisterCluster(req *types.RegisterClusterReq) (*types.CloudResp, error) {
	var phyInfos []models.ScParticipantPhyInfo
	var resp types.CloudResp

	l.svcCtx.DbEngin.Raw("select * from sc_participant_phy_info where `name` = ?", req.Name).Scan(&phyInfos)
	if len(phyInfos) != 0 {
		resp.Code = "400"
		resp.Msg = "cluster name already exist"
		resp.Data = ""
		return &resp, nil
	}

	participant := models.ScParticipantPhyInfo{
		Token:      req.Token,
		Name:       req.Name,
		Address:    req.Address,
		Type:       "CLOUD",
		Id:         utils.GenSnowflakeID(),
		MetricsUrl: req.MetricsUrl,
	}
	tx := l.svcCtx.DbEngin.Create(&participant)
	if tx.Error != nil {
		return nil, tx.Error
	}

	labelInfo := models.ScParticipantLabelInfo{
		Id:            utils.GenSnowflakeID(),
		ParticipantId: participant.Id,
		Key:           "cloud",
		Value:         "sealos",
	}
	tx2 := l.svcCtx.DbEngin.Create(&labelInfo)
	if tx2.Error != nil {
		return nil, tx.Error
	}

	resp.Code = string(200)
	resp.Msg = "success"
	resp.Data = "participantId:" + strconv.FormatInt(participant.Id, 10)
	return &resp, nil
}
