InquiryModel.java

package com.hwhub.backend.domain.model.inquiry;

import com.hwhub.backend.domain.enums.InquiryCategory;
import com.hwhub.backend.domain.enums.InquiryStatus;
import com.hwhub.backend.domain.enums.SenderType;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;

@Getter
public class InquiryModel {
  private final InquiryId inquiryId;
  private final long userId;
  private final InquiryCategory category;
  private InquiryStatus status;
  private final String title;
  private final List<InquiryMessageModel> messages;
  private final LocalDateTime createdAt;

  private InquiryModel(
      InquiryId inquiryId,
      long userId,
      InquiryCategory category,
      InquiryStatus status,
      String title,
      List<InquiryMessageModel> messages,
      LocalDateTime createdAt) {
    this.inquiryId = inquiryId;
    this.userId = userId;
    this.category = category;
    this.status = status;
    this.title = title;
    this.messages = messages;
    this.createdAt = createdAt;
  }

  public static InquiryModel newInquiry(
      long userId, InquiryCategory category, String title, String firstMessageBody) {
    List<InquiryMessageModel> messages = new ArrayList<>();
    messages.add(InquiryMessageModel.newMessage(null, 1, SenderType.YOU, firstMessageBody));
    return new InquiryModel(null, userId, category, InquiryStatus.OPEN, title, messages, null);
  }

  public static InquiryModel reconstruct(
      Long inquiryId,
      long userId,
      String category,
      String status,
      String title,
      List<InquiryMessageModel> messages,
      LocalDateTime createdAt) {
    return new InquiryModel(
        new InquiryId(inquiryId),
        userId,
        InquiryCategory.fromCode(category),
        InquiryStatus.fromCode(status),
        title,
        new ArrayList<>(messages),
        createdAt);
  }

  public InquiryMessageModel addMessage(String body, SenderType senderType) {
    return InquiryMessageModel.newMessage(this.inquiryId, messages.size() + 1, senderType, body);
  }

  public void close() {
    if (this.status == InquiryStatus.CLOSED) {
      throw new IllegalStateException("Inquiry is already closed");
    }
    this.status = InquiryStatus.CLOSED;
  }

  public void escalateToStaff() {
    if (this.status != InquiryStatus.AI_ANSWERED) {
      throw new IllegalStateException(
          "Escalation to staff is only allowed from AI_ANSWERED status");
    }
    this.status = InquiryStatus.PENDING_STAFF;
  }

  public void applyAiAnswer(String body) {
    this.status = InquiryStatus.AI_ANSWERED;
    InquiryMessageModel aiMessage =
        InquiryMessageModel.newMessage(
            this.inquiryId, messages.size() + 1, SenderType.AI_SUPPORT, body);
    this.messages.add(aiMessage);
  }
}