package com.unicorn.hgzero.notification.dto.response;

import com.unicorn.hgzero.notification.domain.Notification;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 알림 목록 응답 DTO
 *
 * 알림 목록 조회 시 사용
 * 알림 기본 정보만 포함 (수신자 정보 제외)
 *
 * @author 준호 (Backend Developer)
 * @version 1.0
 * @since 2025-10-23
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(description = "알림 목록 응답")
public class NotificationListResponse {

    @Schema(description = "알림 ID", example = "550e8400-e29b-41d4-a716-446655440000")
    private String notificationId;

    @Schema(description = "참조 대상 ID", example = "meeting-001")
    private String referenceId;

    @Schema(description = "참조 유형", example = "MEETING")
    private String referenceType;

    @Schema(description = "알림 유형", example = "INVITATION")
    private String notificationType;

    @Schema(description = "알림 제목", example = "회의 초대: 주간 회의")
    private String title;

    @Schema(description = "알림 상태", example = "SENT")
    private String status;

    @Schema(description = "발송 채널", example = "EMAIL")
    private String channel;

    @Schema(description = "발송 완료 건수", example = "5")
    private Integer sentCount;

    @Schema(description = "발송 실패 건수", example = "0")
    private Integer failedCount;

    @Schema(description = "생성 일시", example = "2025-01-23T10:00:00")
    private LocalDateTime createdAt;

    @Schema(description = "발송 완료 일시", example = "2025-01-23T10:05:00")
    private LocalDateTime sentAt;

    /**
     * Entity를 DTO로 변환
     *
     * @param notification 알림 엔티티
     * @return 알림 목록 응답 DTO
     */
    public static NotificationListResponse from(Notification notification) {
        return NotificationListResponse.builder()
            .notificationId(notification.getNotificationId())
            .referenceId(notification.getReferenceId())
            .referenceType(notification.getReferenceType().name())
            .notificationType(notification.getNotificationType().name())
            .title(notification.getTitle())
            .status(notification.getStatus().name())
            .channel(notification.getChannel().name())
            .sentCount(notification.getSentCount())
            .failedCount(notification.getFailedCount())
            .createdAt(notification.getCreatedAt())
            .sentAt(notification.getSentAt())
            .build();
    }
}
