package com.unicorn.hgzero.meeting.biz.dto;

import com.unicorn.hgzero.meeting.biz.domain.Meeting;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 회의 데이터 전송 객체
 * 회의 관련 정보 전달
 */
@Getter
@Builder
public class MeetingDTO {

    /**
     * 회의 고유 식별자
     */
    private final String meetingId;

    /**
     * 회의 제목
     */
    private final String title;

    /**
     * 회의 시작 시간
     */
    private final LocalDateTime startTime;

    /**
     * 회의 종료 시간
     */
    private final LocalDateTime endTime;

    /**
     * 회의 장소
     */
    private final String location;

    /**
     * 회의 안건
     */
    private final String agenda;

    /**
     * 참석자 목록
     */
    private final List<ParticipantDTO> participants;

    /**
     * 회의 상태
     */
    private final String status;

    /**
     * 회의 주최자
     */
    private final String organizer;

    /**
     * 생성 시간
     */
    private final LocalDateTime createdAt;

    /**
     * 수정 시간
     */
    private final LocalDateTime updatedAt;

    /**
     * Meeting 도메인 객체로부터 MeetingDTO 생성
     */
    public static MeetingDTO from(Meeting meeting) {
        return MeetingDTO.builder()
                .meetingId(meeting.getMeetingId())
                .title(meeting.getTitle())
                .startTime(meeting.getStartedAt() != null ? meeting.getStartedAt() : meeting.getScheduledAt())
                .endTime(meeting.getEndedAt())
                .location(null) // Meeting 도메인에 location 필드가 없어서 null로 설정
                .agenda(meeting.getDescription())
                .participants(meeting.getParticipants().stream()
                        .map(participantId -> ParticipantDTO.builder()
                                .userId(participantId)
                                .email(null) // 참석자 정보는 별도 조회 필요
                                .name(null)
                                .role("PARTICIPANT")
                                .build())
                        .toList())
                .status(meeting.getStatus())
                .organizer(meeting.getOrganizerId())
                .createdAt(null) // Meeting 도메인에 createdAt 필드가 없음
                .updatedAt(null) // Meeting 도메인에 updatedAt 필드가 없음
                .build();
    }

    /**
     * 참석자 정보
     */
    @Getter
    @Builder
    public static class ParticipantDTO {
        private final String userId;
        private final String email;
        private final String name;
        private final String role;
    }
}