package impl

import (
	"context"

	appconfig "github.com/tidbcloud/dataflow-service/app/config"
	"github.com/tidbcloud/dataflow-service/app/models/backup"
	"github.com/tidbcloud/dataflow-service/app/models/domain"
	bizerr_wrapper "github.com/tidbcloud/dataflow-service/pkg/bizerr-wrapper"
	"github.com/tidbcloud/dataflow-service/pkg/log"
	"github.com/tidbcloud/pkgv2/bizerr"
	"go.uber.org/zap"
)

type backupCreateRouter struct {
	settingM  backup.BackupSettingModel
	snapshotM backup.SnapshotBackupModel
	pitM      backup.PitBackupModel
}

var _ backup.BackupCreateRouter = &backupCreateRouter{}

func NewBackupCreateRouter(
	settingM backup.BackupSettingModel, snapshotM backup.SnapshotBackupModel, pitM backup.PitBackupModel,
) backup.BackupCreateRouter {
	return &backupCreateRouter{
		settingM:  settingM,
		snapshotM: snapshotM,
		pitM:      pitM,
	}
}

func (r *backupCreateRouter) AsyncCreate(
	ctx context.Context, req *domain.AsyncCreateBackupReq,
) (*domain.AsyncCreateBackupResp, bizerr.BizError) {
	logger := log.GetLogger(ctx)
	settingResp, err := r.settingM.QueryBackupSetting(ctx, &req.ClusterID)
	if err != nil {
		return nil, err
	}
	setting := settingResp.BackupSetting
	if !setting.IsEligibleForBackup() {
		logger.Warn("backup settings not normal or editing_pitr", zap.Uint64("setting id", setting.ID.Uint64()))
		return nil, bizerr_wrapper.NewInternalErr(appconfig.ErrMsgInternalError, req.ClusterID)
	}
	if setting.IsPiTREnabled() {
		return r.pitM.AsyncCreate(ctx, req)
	} else {
		return r.snapshotM.AsyncCreate(ctx, req)
	}
}
