package com.zioinfo.hrm.uiws.message.dto;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;

import java.util.List;

/**
 * 쪽지(모듈 03) 요청/응답 DTO 모음. 원본 com.urp.uiws.message.dto.* 이식(필드·shape 동일).
 * 프론트 경계면 계약 유지: API 응답 필드명 그대로 보존.
 */
public final class MessageDtos {

    private MessageDtos() {
    }

    /** 전송/답장 요청. */
    public record MessageSendDto(
            @NotBlank String title,
            @NotBlank String content,
            Long refWorklogId,
            Long replyToId,
            @Valid @NotEmpty(message = "수신자는 1명 이상이어야 합니다.") List<MessageReceiverDto> receivers
    ) {
    }

    /** 수신자 1건. rcvType: RECV(수신) | REF(참조). */
    public record MessageReceiverDto(
            @NotBlank String receiverId,
            @NotBlank String rcvType
    ) {
    }

    /** 전송 응답. */
    public record MessageSendResponse(Long messageId) {
    }

    /** 보낸쪽지함 행. */
    public record SentMessageDto(
            Long messageId,
            String title,
            String receiverSummary,
            long openCount,
            long totalCount,
            String sentAt
    ) {
    }

    /** 보낸쪽지 상세(수신자 개봉현황). */
    public record SentMessageDetailDto(
            Long messageId,
            String title,
            String content,
            Long refWorklogId,
            String sentAt,
            List<ReceiverStatusDto> receivers,
            long totalCount,
            long openCount,
            long unopenCount
    ) {
    }

    /** 수신자별 개봉현황. */
    public record ReceiverStatusDto(
            String receiverNm,
            String rcvType,
            String readYn,
            String readAt
    ) {
    }

    /** 받은쪽지함 행. */
    public record ReceivedMessageDto(
            Long messageId,
            String title,
            String senderNm,
            String sentAt,
            String readYn
    ) {
    }

    /** 받은쪽지 상세(조회 시 개봉처리). */
    public record ReceivedMessageDetailDto(
            Long messageId,
            String title,
            String content,
            String senderNm,
            String sentAt,
            String receivedAt,
            Long refWorklogId
    ) {
    }

    /** 다중삭제 본문. */
    public record MessageIdsRequest(
            @NotEmpty(message = "ids는 필수입니다.") List<Long> ids
    ) {
    }
}
