package args

import (
	"quyun/v2/providers/job"

	. "github.com/riverqueue/river"
	"go.ipao.vip/atom/contracts"
)

var _ contracts.JobArgs = OrderRefundJob{}

// OrderRefundJob 表示“订单退款处理”的一次性异步任务。
//
// 设计说明：
// - 该任务用于将订单从 refunding 推进到 refunded/failed（由 worker 执行核心退款逻辑）。
// - 幂等由 River Unique + 业务侧 DB 幂等（ledger idempotency、状态机）共同保证。
type OrderRefundJob struct {
	// TenantID 租户ID（用于多租户隔离与唯一性维度）。
	TenantID int64 `json:"tenant_id" river:"unique"`
	// OrderID 订单ID（用于唯一性维度）。
	OrderID int64 `json:"order_id" river:"unique"`

	// OperatorUserID 退款操作人用户ID（租户管理员/系统），用于 worker 在必要时回填审计字段。
	OperatorUserID int64 `json:"operator_user_id"`
	// Force 是否强制退款（绕过时间窗）。
	Force bool `json:"force"`
	// Reason 退款原因（用于审计；worker 可用于补齐订单字段）。
	Reason string `json:"reason"`
}

func (OrderRefundJob) Kind() string { return "order_refund" }

func (a OrderRefundJob) UniqueID() string { return a.Kind() }

func (OrderRefundJob) InsertOpts() InsertOpts {
	return InsertOpts{
		Queue:    job.QueueDefault,
		Priority: job.PriorityDefault,
		// 失败可重试；由 worker 判断不可重试的场景并 JobCancel。
		MaxAttempts: 10,
		UniqueOpts: UniqueOpts{
			ByArgs: true,
		},
	}
}
