package com.zioinfo.kintex.ticket.dto;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

import java.util.List;

/**
 * 입장권(티켓) 도메인 DTO 모음 (M10 관람객 · M9 정산). 전 공개 경로.
 * <p>보안(§0-3): 응답 어디에도 구매자 PII 원문을 담지 않는다 — 마스킹 필드만 노출.
 */
public final class TicketDtos {

    private TicketDtos() {
    }

    /** 판매 상품 카드 — 잔여수량·판매기간은 서버 권위. */
    public record TicketProductDto(
            String id,
            String eventId,
            String code,
            String kind,
            String name,
            String description,
            long price,
            String currency,
            String saleStart,
            String saleEnd,
            int totalQty,
            int remaining,
            int maxPerOrder,
            boolean onSale,
            boolean soldOut,
            int sortOrder) {
    }

    /** 예매 요청 — 단일 상품 + 수량. */
    public record OrderRequest(
            @NotBlank String productId,
            @NotNull @Min(1) @Max(100) Integer qty,
            @NotBlank String buyerName,
            @NotBlank String buyerContact,
            String buyerEmail,
            @NotNull Boolean agreePrivacy,
            String payMethod) {
    }

    /** 발권된 개별 티켓. */
    public record IssuedTicketDto(String ticketCode, int seq, boolean used) {
    }

    /** 예매 결과 — 주문번호 + 발권 티켓. 구매자는 마스킹만. */
    public record OrderResultDto(
            String orderNo,
            String status,
            String eventId,
            String productName,
            int qty,
            long unitPrice,
            long totalAmount,
            String payMethod,
            String approvalNo,
            String buyerNameMasked,
            String buyerContactMasked,
            String buyerEmailMasked,
            String orderedAt,
            List<IssuedTicketDto> tickets) {
    }

    /** 예매 조회 결과 — 주문번호 + 연락처 대조 성공 시. PII 마스킹만. */
    public record LookupResultDto(
            String orderNo,
            String status,
            String eventId,
            String productName,
            int qty,
            long unitPrice,
            long totalAmount,
            String payMethod,
            String buyerNameMasked,
            String buyerContactMasked,
            String buyerEmailMasked,
            String orderedAt,
            String paidAt,
            List<IssuedTicketDto> tickets) {
    }
}
