package com.zioinfo.kintex.boothsales.dto;

import jakarta.validation.constraints.NotBlank;

import java.util.List;

/**
 * F005/F006 부스 판매 인벤토리·셀프 판매 DTO 묶음.
 * <p>금액은 모두 서버 계산 권위(원 단위, long). 민감정보·PII 미포함(표시용 참가업체명만).
 * {@code status} 는 서버가 파생한 <b>실효 상태</b>(만료 hold 는 available 로 강등된 값)이다.
 */
public final class BoothSalesDtos {

    private BoothSalesDtos() {
    }

    /**
     * 판매 인벤토리 단위 — M2 booth(좌표) + 판매 오버레이 병합.
     *
     * @param status    available|held|sold|blocked (실효 상태 — 만료 hold 는 available)
     * @param unitPrice 서버 권위 판매가(원) = override 또는 면적×요율 파생
     * @param heldByMe  현재 요청자가 hold 중인지(셀프 구매 버튼 노출용) — 서버 판정
     * @param heldUntil hold 만료 ISO 8601 또는 null
     */
    public record BoothSaleUnit(
            String boothId,
            String boothNo,
            String boothType,
            String hallId,
            String hallLabel,
            double areaM2,
            String status,
            long unitPrice,
            boolean heldByMe,
            String heldUntil,
            String soldToCompany
    ) {
    }

    /**
     * 인벤토리 조회 응답 — 단위 목록 + 상태 요약 + 요율 근거.
     * 참가업체 시점은 available 만, 주최자/매니저 시점은 전 상태 포함(canManage=true).
     */
    public record InventoryResponse(
            String eventId,
            String hallId,
            String rulesetVersion,
            long ratePerM2,
            int available,
            int held,
            int sold,
            int blocked,
            boolean canManage,
            int holdTtlMinutes,
            List<BoothSaleUnit> units
    ) {
    }

    /** 부스 hold 요청(참가업체 셀프 선택) — TTL 은 서버 고정. */
    public record HoldRequest(
            @NotBlank String eventId,
            @NotBlank String boothId
    ) {
    }

    /** 구매 확정 요청(hold→sold) — 금액은 서버 재계산(요청 금액 무시). */
    public record PurchaseRequest(
            @NotBlank String eventId,
            @NotBlank String boothId,
            String company   // 표시용 참가업체명(선택) — 미지정 시 booth.assigned_company_name
    ) {
    }

    /** 주최자 blocked/available 전환 요청. */
    public record BlockRequest(
            @NotBlank String eventId,
            @NotBlank String boothId,
            boolean blocked,
            String reason
    ) {
    }

    /** 주최자 판매가 override 요청(원, null=면적×요율 파생 복원). */
    public record PriceRequest(
            @NotBlank String eventId,
            @NotBlank String boothId,
            Long unitPrice
    ) {
    }

    /** 상태 전이 결과(hold/purchase/block/price 공통) — 갱신된 단위 반환. */
    public record BoothSaleResult(
            String action,   // held|purchased|released|blocked|unblocked|priced
            BoothSaleUnit unit
    ) {
    }
}
