package repo_imp

import (
	"context"

	"github.com/tidbcloud/chaos-svc/model"
	"github.com/tidbcloud/chaos-svc/pkg/domain/constant"
	"github.com/tidbcloud/chaos-svc/pkg/domain/repo"
	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/pkgv2/db"
)

type workflowLockRepoImp struct {
	dbProvider db.Provider
}

func NewWorkflowLockRepo(dbProvider db.Provider) repo.WorkflowLockRepo {
	return &workflowLockRepoImp{dbProvider: dbProvider}
}

func (imp *workflowLockRepoImp) Lock(ctx context.Context, scene constant.LockScene, identifier string) bizerr.BizError {
	wdb := imp.dbProvider.WriteDB(ctx)

	lock := model.WorkflowLock{
		Base:       model.Base{},
		Scene:      string(scene),
		Identifier: identifier,
	}

	if err := wdb.Create(&lock).Error; err != nil {
		return bizerr.WrapGormError(err, "create cm lock")
	}
	return nil
}

func (imp *workflowLockRepoImp) Unlock(ctx context.Context, scene constant.LockScene, identifier string) bizerr.BizError {
	wdb := imp.dbProvider.WriteDB(ctx)

	if err := wdb.Where("scene=? AND identifier=?", string(scene), identifier).Delete(&model.WorkflowLock{}).Error; err != nil {
		return bizerr.WrapGormError(err, "delete workflow lock")
	}
	return nil
}
