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

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

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

/**
 * 회의 도메인 모델
 */
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Meeting {

    /**
     * 회의 ID
     */
    private String meetingId;

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

    /**
     * 회의 설명
     */
    private String description;

    /**
     * 회의 목적
     */
    private String purpose;

    /**
     * 회의 일시
     */
    private LocalDateTime scheduledAt;

    /**
     * 회의 종료 예정 일시
     */
    private LocalDateTime endTime;

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

    /**
     * 회의 시작 일시
     */
    private LocalDateTime startedAt;

    /**
     * 회의 종료 일시
     */
    private LocalDateTime endedAt;

    /**
     * 회의 상태 (SCHEDULED, IN_PROGRESS, COMPLETED, CANCELLED)
     */
    private String status;

    /**
     * 주최자 ID
     */
    private String organizerId;

    /**
     * 참석자 ID 목록
     */
    private List<String> participants;

    /**
     * 템플릿 ID
     */
    private String templateId;

    /**
     * 회의 시작
     */
    public void start() {
        this.status = "IN_PROGRESS";
        this.startedAt = LocalDateTime.now();
    }

    /**
     * 회의 종료
     */
    public void end() {
        this.status = "COMPLETED";
        this.endedAt = LocalDateTime.now();
    }

    /**
     * 회의 취소
     */
    public void cancel() {
        this.status = "CANCELLED";
    }

    /**
     * 회의 진행 중 여부 확인
     */
    public boolean isInProgress() {
        return "IN_PROGRESS".equals(this.status);
    }

    /**
     * 참석자 추가
     */
    public void addParticipant(String participantEmail) {
        if (this.participants == null) {
            this.participants = new ArrayList<>();
        } else if (!(this.participants instanceof ArrayList)) {
            // 불변 리스트인 경우 새로운 ArrayList로 변환
            this.participants = new ArrayList<>(this.participants);
        }
        
        if (!this.participants.contains(participantEmail)) {
            this.participants.add(participantEmail);
        }
    }

    /**
     * 템플릿 적용
     */
    public void applyTemplate(String templateId) {
        this.templateId = templateId;
    }
}
