using Application.Abstractions.Messaging;
using Domain.Entities.Store.ValueObject;
using SharedKernel.Results;
namespace Application.Features.Admin.Store.Order.RequestCouponsRefund;
///
/// 쿠폰 단위 일괄 환불 요청 등록.
///
/// 동작:
/// 1. CouponCode 별 OrderRefundItem 1행씩 생성 (PostRefundAction 명시)
/// 2. OrderRefund 1행 생성 — Amount = Σ OrderItem.UnitPrice (선택된 쿠폰 분)
/// 3. Status=Requested 로 시작. 실제 환불은 별도 ProcessRefund 호출
///
/// 검증:
/// - 모든 CouponCodeID 가 OrderItem 의 MemberInventory 에 존재
/// - PostRefundAction=Restore 인데 CouponCode 가 Used 면 거부 (RestoreToAvailable 가 throw 함)
/// - 이미 다른 OrderRefundItem 에 등록된 CouponCodeID 거부 (unique index 위반 사전 차단)
///
/// 환불 요청에 포함할 개별 쿠폰 + 후처리.
public sealed record CouponRefundLine(int OrderItemID, int CouponCodeID, CouponPostRefundAction PostRefundAction);
public sealed record Command(
int OrderID,
IReadOnlyList Lines,
string Reason,
RefundReasonType ReasonType = RefundReasonType.Other
) : ICommand>;