package study.orderflow.mapper;

import java.math.BigDecimal;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/// 全部 SQL 显式携带 tenant 条件：服务端租户裁决落在行级（S02）。
/// available >= quantity 是原子条件扣减（T02）。
@Mapper
public interface OrderMapper {

    Map<String, Object> findStock(@Param("tenant") String tenant, @Param("sku") String sku);

    /** 原子条件扣减：影响行数 0 表示库存不足或租户/SKU 不存在。 */
    int deductStock(@Param("tenant") String tenant, @Param("sku") String sku,
            @Param("quantity") int quantity);

    int insertOrder(@Param("tenant") String tenant, @Param("sku") String sku,
            @Param("quantity") int quantity, @Param("amount") BigDecimal amount,
            @Param("idempotencyKey") String idempotencyKey);

    /** 提交后回写 order_id，重复请求按 key 查到原订单。 */
    int linkIdempotencyToOrder(@Param("idempotencyKey") String idempotencyKey,
            @Param("tenant") String tenant, @Param("orderId") long orderId);

    /** 幂等键唯一约束裁决重复（T04）。返回插入行数，重复时抛 DuplicateKey。 */
    int insertIdempotency(@Param("idempotencyKey") String idempotencyKey,
            @Param("tenant") String tenant, @Param("requestHash") String requestHash);

    Map<String, Object> findIdempotency(@Param("idempotencyKey") String idempotencyKey,
            @Param("tenant") String tenant);

    Map<String, Object> findOrder(@Param("id") long id, @Param("tenant") String tenant);

    Map<String, Object> findOrderByKey(@Param("idempotencyKey") String idempotencyKey,
            @Param("tenant") String tenant);

    /** U80：发布意图与订单在同一物理事务提交（event_id 唯一约束防重复意图）。 */
    int insertOutbox(@Param("eventId") String eventId, @Param("aggregateId") long aggregateId,
            @Param("aggregateVersion") long aggregateVersion, @Param("payload") String payload);

    int countOrders(@Param("tenant") String tenant);
}
