package connector_outboundintent

import (
	"context"

	outboundintentv1 "github.com/pingcap-inc/nexuscrm-contract/pkg/runtime/outboundintentv1"
)

// OperationPreparer keeps the durable worker lifecycle singular while routing
// the typed mail operation to its dedicated preparer. Existing resource
// operations retain the current provider preparation path.
type OperationPreparer struct {
	mail     Preparer
	fallback Preparer
}

func NewOperationPreparer(mail, fallback Preparer) (*OperationPreparer, error) {
	if mail == nil || fallback == nil {
		return nil, ErrDependency
	}
	return &OperationPreparer{mail: mail, fallback: fallback}, nil
}

func (preparer *OperationPreparer) Prepare(ctx context.Context, command Command) (PreparedEffect, error) {
	if preparer == nil || preparer.mail == nil || preparer.fallback == nil || ctx == nil {
		return nil, ErrDependency
	}
	if command.Intent.Operation == outboundintentv1.OperationSendMail {
		return preparer.mail.Prepare(ctx, command)
	}
	return preparer.fallback.Prepare(ctx, command)
}

var _ Preparer = (*OperationPreparer)(nil)
