package connector_events

import (
	"context"
	"time"

	connector_workqueue "github.com/pingcap-inc/nexuscrm-connectors/features/connector/workqueue"
)

// FailWorkItem delegates the only failure-budget transition exposed to the
// inbound executor. Event rows remain immutable execution input after their
// ownership is transferred to a WorkItem.
func (s *Service) FailWorkItem(ctx context.Context, in connector_workqueue.FailWorkItemInput) (*connector_workqueue.FailWorkItemResult, bool, error) {
	if err := s.requireWorkItemClaimInputs(); err != nil {
		return nil, false, err
	}
	return s.workqueue.FailWorkItem(ctx, in)
}

// CompleteWorkItem applies a terminal WorkItem transition under its lease CAS.
func (s *Service) CompleteWorkItem(ctx context.Context, workID, leaseToken, terminalState string, now time.Time) (bool, error) {
	if err := s.requireWorkItemClaimInputs(); err != nil {
		return false, err
	}
	return s.workqueue.CompleteWorkItem(ctx, workID, leaseToken, terminalState, now)
}

// RetryWorkItem releases a WorkItem lease without consuming failure budget.
func (s *Service) RetryWorkItem(ctx context.Context, workID, leaseToken string, runAfter, now time.Time) (bool, error) {
	if err := s.requireWorkItemClaimInputs(); err != nil {
		return false, err
	}
	return s.workqueue.RetryWorkItem(ctx, workID, leaseToken, runAfter, now)
}

// RenewWorkItemLease extends the current WorkItem lease under its token CAS.
func (s *Service) RenewWorkItemLease(ctx context.Context, workID, leaseToken string, leaseUntil, now time.Time) (bool, error) {
	if err := s.requireWorkItemClaimInputs(); err != nil {
		return false, err
	}
	return s.workqueue.RenewWorkItemLease(ctx, workID, leaseToken, leaseUntil, now)
}
