package task

import (
	"context"

	"github.com/hibiken/asynq"
	"go.uber.org/zap"
)

// OrderExpirer 订单超时取消接口（局部定义，避免循环依赖）
type OrderExpirer interface {
	CancelExpiredOrders(ctx context.Context) (int, error)
}

// OrderExpireHandler 订单超时自动取消任务处理器
type OrderExpireHandler struct {
	orderExpirer OrderExpirer
	logger       *zap.Logger
}

// NewOrderExpireHandler 创建订单超时处理器
func NewOrderExpireHandler(orderExpirer OrderExpirer, logger *zap.Logger) *OrderExpireHandler {
	return &OrderExpireHandler{
		orderExpirer: orderExpirer,
		logger:       logger,
	}
}

// HandleOrderExpire 处理订单超时取消任务
// 由 Asynq Scheduler 每分钟触发，扫描并取消所有已超时的待支付订单
func (h *OrderExpireHandler) HandleOrderExpire(ctx context.Context, _ *asynq.Task) error {
	cancelled, err := h.orderExpirer.CancelExpiredOrders(ctx)
	if err != nil {
		h.logger.Error("订单超时自动取消失败", zap.Error(err))
		return err
	}

	if cancelled > 0 {
		h.logger.Info("订单超时自动取消完成", zap.Int("cancelled", cancelled))
	}

	return nil
}
