package trigger

import (
	"github.com/juju/errors"
	"github.com/ngaut/log"
	"github.com/pingcap/schrodinger/pkg/storage"
	"github.com/pingcap/schrodinger/pkg/types"
)

// ImmediatelyTrigger is immediately trigger
type ImmediatelyTrigger struct {
	storage *storage.Storage
}

// NewImmediatelyTrigger creates immediately trigger
func NewImmediatelyTrigger(s *storage.Storage) Interface {
	return &ImmediatelyTrigger{
		storage: s,
	}
}

// AddJob adds immediately job
func (i *ImmediatelyTrigger) AddJob(ruleValue string, fn func(), jobID int64) error {
	_, exist := i.storage.GetImmediatelyTriggerInfo(jobID)
	if exist {
		log.Debugf("[trigger: %d] already triggerd, not trigger again", jobID)
		return nil
	}
	immediatelyTriggerInfo := &types.ImmediateTriggerInfo{
		JobID:    jobID,
		Triggerd: true,
	}
	err := i.storage.SetImmediatelyTriggerInfo(immediatelyTriggerInfo)
	if err != nil {
		return errors.Trace(err)
	}
	log.Infof("trigger box %d by immediately trigger", jobID)
	fn()
	return nil
}

// DelJob dels job
func (i *ImmediatelyTrigger) DelJob(jobID int64) error {
	return nil
}

func (i *ImmediatelyTrigger) name() string {
	return "immediately"
}
