package globalservice

import (
	"context"

	"github.com/tidbcloud/observability/pkg/common/message"
	"github.com/tidbcloud/observability/pkg/common/structs"
	"github.com/tidbcloud/observability/pkg/metamanager/s3"

	"sync"
)

type ModelHandler struct {
}

var (
	modelHandler     *ModelHandler
	modelHandlerOnce sync.Once
)

// GetModelHandler returns the singleton of ModelHandler.
func GetModelHandler() *ModelHandler {
	modelHandlerOnce.Do(func() {
		if modelHandler == nil {
			modelHandler = new(ModelHandler)
		}
	})

	return modelHandler
}

func (p *ModelHandler) CreateModel(ctx context.Context, req message.CreateModelReq) (resp message.CreateModelResp, err error) {
	model := structs.Model{
		Name:    req.Name,
		Version: req.Version,
		Type:    req.Type,
		Config:  req.Config,
	}

	err = s3.GetModelMetaService().SaveMeta(ctx, model)
	if err != nil {
		return resp, err
	}

	resp.Model = model

	return resp, nil
}

func (p *ModelHandler) GetModel(ctx context.Context, req message.GetModelReq) (resp message.GetModelResp, err error) {
	model, err := s3.GetModelMetaService().GetMeta(ctx, req.Name, req.Version)
	if err != nil {
		return resp, err
	}

	resp.Model = model

	return resp, nil
}
