package com.zioinfo.kintex.ticket;

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

import java.util.List;
import java.util.Map;

/**
 * 입장권 도메인 매퍼 — tenant_id='KINTEX' 고정. XML: mybatis/mapper/TicketMapper.xml.
 * <p>★ 재고 차감은 {@link #decrementStock}(조건부 UPDATE)로 oversell 를 원자적으로 방지한다.
 * <p>★ camelCase 별칭은 XML 에서 {@code AS "x"} 쌍따옴표(PG lower-fold 방지).
 */
@Mapper
public interface TicketMapper {

    /** 행사별 판매 상품 목록(정렬순). remaining 은 total-sold 로 계산해 서빙. */
    List<Map<String, Object>> findProducts(@Param("eventId") String eventId);

    /** 단일 상품(주문 검증용). 없으면 null. */
    Map<String, Object> findProduct(@Param("productId") String productId);

    /**
     * 조건부 재고 차감 — {@code sold_qty += qty WHERE 판매중 AND (total-sold) >= qty}.
     * 반환 갱신행수 1 이면 확보 성공, 0 이면 매진/판매종료(oversell 차단).
     */
    int decrementStock(@Param("productId") String productId, @Param("qty") int qty);

    /** 주문번호 존재 여부(생성 충돌 회피). */
    int countOrderNo(@Param("orderNo") String orderNo);

    /** 주문 삽입. */
    int insertOrder(Map<String, Object> order);

    /** 발권 1건 삽입. */
    int insertIssue(Map<String, Object> issue);

    /** 조회 — 주문번호 + 연락처 해시 대조(둘 다 일치해야 반환). 없으면 null. */
    Map<String, Object> findOrderForLookup(@Param("orderNo") String orderNo,
                                           @Param("contactHash") String contactHash);

    /** 주문의 발권 티켓 목록(seq 순). */
    List<Map<String, Object>> findIssuesByOrder(@Param("orderId") String orderId);
}
