package com.zioinfo.kintex.logistics.dto;

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

import java.util.List;

/**
 * M8 물류 확장 DTO 묶음 — F041 장비 신청 · F042 렌탈 주문 · F043 선입고 트래킹.
 * 금액(amount)은 서버 계산 권위(카탈로그 단가 정본). 상태 전이는 매니저 이상 API 로만 수행.
 */
public final class LogisticsExtDtos {

    private LogisticsExtDtos() {
    }

    // ── ① 부대장비 신청(F041) ────────────────────────────────────────────────
    /** 장비 카탈로그 품목(마스터). */
    public record EquipmentItem(
            String id,
            String code,
            String name,
            String category,
            String unit,
            long unitPrice,
            String spec
    ) {
    }

    /** 장비 신청 생성 요청 — 금액·단가는 서버가 카탈로그에서 재계산(요청 값 무시). */
    public record EquipmentRequestBody(
            @NotBlank String equipmentId,
            String boothNo,
            @Min(1) int quantity,
            String useDate,
            @Min(1) int days,
            String note
    ) {
    }

    /** 장비 신청 항목(조회/응답). status: requested|approved|rejected|done. */
    public record EquipmentRequestView(
            String id,
            String equipmentId,
            String equipmentName,
            String category,
            long unitPrice,
            String boothNo,
            int quantity,
            String useDate,
            int days,
            long amount,
            String status,
            String note,
            String rejectReason,
            String createdAt
    ) {
    }

    // ── ② 부대물품 렌탈 주문(F042) ──────────────────────────────────────────
    /** 렌탈 카탈로그 품목. */
    public record RentalItem(
            String id,
            String code,
            String name,
            String category,
            String unit,
            long dailyPrice,
            String spec
    ) {
    }

    /** 렌탈 주문 생성 요청 — 기간(days)·금액은 서버가 산출(start/end 우선, 없으면 days). */
    public record RentalOrderBody(
            @NotBlank String itemId,
            String boothNo,
            @Min(1) int quantity,
            String startDate,
            String endDate,
            @Min(1) int days,
            String note
    ) {
    }

    /** 렌탈 주문 항목(조회/응답). status: ordered|confirmed|cancelled|delivered. */
    public record RentalOrderView(
            String id,
            String itemId,
            String itemName,
            String category,
            long dailyPrice,
            String boothNo,
            int quantity,
            String startDate,
            String endDate,
            int days,
            long amount,
            String status,
            String note,
            String createdAt
    ) {
    }

    // ── ③ 선입고 트래킹(F043) ────────────────────────────────────────────────
    /** 선입고(운송장) 등록 요청. */
    public record InboundBody(
            @NotBlank String trackingNo,
            String carrier,
            String boothNo,
            String itemDesc,
            @Min(1) int quantity,
            String etaDate,
            String note
    ) {
    }

    /** 선입고 상태 전이 요청 — status: inbound_scheduled|arrived_warehouse|delivered_booth. */
    public record InboundStatusBody(
            @NotBlank String status,
            String note
    ) {
    }

    /** 선입고 항목(조회/응답). */
    public record InboundView(
            String id,
            String trackingNo,
            String carrier,
            String boothNo,
            String itemDesc,
            int quantity,
            String status,
            String etaDate,
            String warehouseAt,
            String deliveredAt,
            String note,
            String createdAt
    ) {
    }

    // ── 공용 상태 전이 요청(장비·렌탈) ───────────────────────────────────────
    /** 매니저 상태 전이 요청. status: (장비) approved|rejected|done / (렌탈) confirmed|cancelled|delivered. */
    public record StatusDecisionBody(
            @NotBlank String status,
            String reason
    ) {
    }

    /** 탭 조회 응답 묶음 — 카탈로그 + 신청/주문/선입고 목록. canManage=매니저 시점 액션 노출용. */
    public record LogisticsExtBoard(
            boolean canManage,
            List<EquipmentItem> equipmentCatalog,
            List<EquipmentRequestView> equipmentRequests,
            List<RentalItem> rentalCatalog,
            List<RentalOrderView> rentalOrders,
            List<InboundView> inbound
    ) {
    }
}
