package console

import (
	"context"

	"github.com/tidbcloud/dataflow-service-ng/app/models/biz_changefeed"
	"github.com/tidbcloud/dataflow-service-ng/app/models/domain"
	dataflow "github.com/tidbcloud/dataflow-service-ng/idl/pbgen/proto/consoleapi"
	"github.com/tidbcloud/dataflow-service-ng/pkg/log"
	"github.com/tidbcloud/pkgv2/db"
	"go.uber.org/zap"
)

type ChangefeedSpecController interface {
	dataflow.ChangefeedSpecServiceServer
}

type bizChangefeedSpecControllerImpl struct {
	dataflow.UnimplementedChangefeedSpecServiceServer
	*BaseController
	changefeedModel biz_changefeed.BizChangefeedModel
}

func NewBizChangefeedSpecController(
	trans db.TransProvider,
	model biz_changefeed.BizChangefeedModel,
) ChangefeedSpecController {
	return &bizChangefeedSpecControllerImpl{
		BaseController:  NewBaseController(trans),
		changefeedModel: model,
	}
}

func (c *bizChangefeedSpecControllerImpl) List(ctx context.Context,
	req *dataflow.ChangefeedSpecListReq,
) (*dataflow.ChangefeedSpecs, error) {
	listReq := &domain.ListBizChangefeedSpecificationsReq{
		ClusterID: req.ClusterId,
	}
	listResp, bizErr := c.changefeedModel.ListBizChangefeedSpecifications(ctx, listReq)
	if bizErr != nil {
		logger := log.GetLogger(ctx).With(zap.Any("req", req))
		c.logError(logger, bizErr, "list changefeed specifications error")
		return nil, bizErr
	}
	return listResp.ToDataflowResp(), nil
}
