const userMessageTemplate = getTemplate(TemplateURL.USER_MESSAGE);
const myMessageTemplate = getTemplate(TemplateURL.MY_MESSAGE);
const systemMessageTemplate = getTemplate(TemplateURL.SYSTEM_MESSAGE);
const collaborationMessageTemplate = getTemplate(
  TemplateURL.OPEN_COLLABORATION_MESSAGE
);
/***********************
 *  Search Messages
 ***********************/
ChatRoom.appendSearchMessages = function (messages, unwrappedWorkVal = "") {
  let workVal = unwrappedWorkVal;
  messages.forEach(function (message) {
    let html = ChatRoom.renderMessageForSearchMessage(message);
    workVal = html + workVal;
  });
  $(".overlay_src_msg").append(workVal);
};

ChatRoom.renderMessageForSearchMessage = function (message) {
  let template = ChatRoom.getChatMessageTemplate(
    message.messageType,
    message.shopMemberId
  );

  let messageTime = CHAT_UTIL.formatDate(message.insertDate);

  message.profileUrl = ChatRoom.parseUserProfileURL(message.profileUrl);

  message.message = message.message
    .toString()
    .replaceAll("?fileName=", "?sid=" + currentUserInfo.sid + "&fileName=");

  let html = Mustache.render(template, {
    text: message.message,
    from: message.loginId,
    shopMemberId: message.shopMemberId,
    profileImage: message.profileUrl,
    createdAtDay: messageTime.createdAtDay,
    createdAtTime: messageTime.createdAtTime,
  });

  return message.message.includes("attachedImages") ||
    message.message.includes("attachedVideos")
    ? CHAT_UTIL.htmlDecode(html)
    : html;
};

/***********************
 *  Send Messages
 ***********************/
// Input recognize
$("#messageInput").on("keypress", function (event) {
  if (event.which == 13) {
    // Enterキーの処理
    $("#messageSend").click();
  }
});

ChatRoom.sendMessage = function (e) {
  const messageTextBox = $("#messageInput");
  const message =
    messageTextBox.val().length > 0
      ? encodeURIComponent(messageTextBox.val())
      : "";
  messageTextBox.val("");

  if (message.length > 0) {
    const sendData = message;
    CHAT_SOCKET.emitCreateText(sendData);
  }
  $(".message_input_form").focus();
};

/***********************
 *  Load Messages
 ***********************/
ChatRoom.loadMessages = function (joinRoomID, joinRoomName) {
  let roomID = joinRoomID.toString().replace(/['"]+/g, "");
  roomName = joinRoomName;
  // 画面更新
  if (serverInfo.isOnline == true) {
    Common.refreshForOnline();
    NativeBridgeDelegate.updateMessages(roomID);
  } else {
    Common.refreshForOffline();
  }

  // setup ルームタイトル
  $("#roomTitle").text(roomName).data("roomName", roomName);

  // ルームメニュー表示設定
  ChatRoom.configureRoomMenu();

  // ユーザー表示
  ChatRoom.appendAttendedUsers(roomID);

  // メッセージ表示
  let messages = NativeBridgeDataSource.getMessagesByRoomID(roomID);
  ChatRoom.prependMessage(messages);


  window.addEventListener(
    "load",
    function (event) {
      ChatRoom.scrollToBottom(false);
    },
    false
  );
};

ChatRoom.configureRoomMenu = function () {
  if (roomInfo.roomType == ChatRoomType.DM) {
    $("#roomMenu").removeClass("none");
  } else {
    $("#roomMenu").addClass("none");
  }
};

ChatRoom.appendAttendedUsers = function (roomID) {
  const topUserListTemplate = getTemplate(TemplateURL.CHATROOM_USER_LIST);
  const filterUserListTemplate = getTemplate(
    TemplateURL.CHATROOM_USER_FILTER_LIST
  );

  const users = NativeBridgeDataSource.getUsersInRoom(roomID);

  // ユーザーリスト表示
  users.forEach(function (user) {
    user.profileUrl = Common.getProfileImgUrl(user.profileUrl);
  });
  let html = Mustache.render(topUserListTemplate, {
    userList: users,
  });
  let obj = jQuery.parseHTML(html);
  $("#user_list").append(obj);

  // フィルタリングユーザーリスト表示
  let filterHtml = Mustache.render(filterUserListTemplate, {
    userList: users,
  });
  let filterObj = jQuery.parseHTML(filterHtml);
  $("#filter").append(filterObj);
};

ChatRoom.prependMessage = function (messages) {
  const now = new Date();

  const messageElement = $("#messages");
  let checkBeforeDate = "";
  let beforeDate = "";
  messages.forEach(function (message) {
    // プロフィールURL設定
    message.profileUrl = ChatRoom.parseUserProfileURL(message.profileUrl);

    const messageCreatedTime = CHAT_UTIL.formatDate(
      message.insertDate
    ).createdAt;

    // #36147
    message.message = message.message
      .toString()
      .replaceAll("?fileName=", "?sid=" + currentUserInfo.sid + "&fileName=");

    // 日付表示のため、今年なのか、本日なのかを判定
    const isOtherYear = now.getFullYear() != message.insertDate.substring(0, 4);
    const isToday = messageCreatedTime.includes(":") ? true : false;

    // 日付ラーベル表示
    if (
      messageCreatedTime != checkBeforeDate 
      && checkBeforeDate != "" 
      && !isToday
    ) {
      const html = ChatRoom.renderDateLabelMessage(beforeDate);
      messageElement.append(html);
    }

    checkBeforeDate = messageCreatedTime;
    beforeDate = message.insertDate;

    const html = ChatRoom.renderMessage(message, isToday, isOtherYear);
    messageElement.append(html);
  });

  // messageが存在する場合、最上段にそのメッセージの日付を表示
  ChatRoom.appendInitialDateMessage(messages);
};

ChatRoom.appendInitialDateMessage = function (messages) {
  if ($(".chat_message").length != 0 && messages.length != 0) {
    $("#initial-date-message").detach();
    const html = ChatRoom.renderDateLabelMessage(
      messages[messages.length - 1].insertDate,
      true
    );
    $("#messages").append(html);
  }
};

ChatRoom.renderDateLabelMessage = function (
  beforeDate,
  isInitialDateMessage = false
) {
  let messageDay = CHAT_UTIL.systemDay(beforeDate);
  return Mustache.render(systemMessageTemplate, {
    year: messageDay.year + getLocalizedString("year"),
    month: messageDay.month + getLocalizedString("month"),
    day: messageDay.day + getLocalizedString("day"),
    dow: CHAT_UTIL.findDow(messageDay.dow),
    isInitalDateMessage: isInitialDateMessage,
  });
};

ChatRoom.getChatMessageTemplate = function (messageType, senderID) {
  if (senderID == currentUserInfo.shopMemberID) {
    return myMessageTemplate;
  } else if (messageType == MessageType.SYSTEM) {
    return systemMessageTemplate;
  } else {
    return userMessageTemplate;
  }
};

ChatRoom.parseUserProfileURL = function (profileURL) {
  if (profileURL) {
    return Common.getProfileImgUrl(profileURL);
  } else {
    return Common.getProfileImgUrl("");
  }
};

ChatRoom.renderMessage = function (message, isToday, isOtherYear) {
  if (
    message.messageType == MessageType.COMMUNICATIONSTART ||
    message.messageType == MessageType.COMMUNICATIONEND
  ) {
    return ChatRoom.renderCollaborationMessage(message, isToday, isOtherYear);
  } else {
    return ChatRoom.renderChatMessage(message, isToday, isOtherYear);
  }
};

ChatRoom.renderCollaborationMessage = function (message, isToday, isOtherYear) {
  const collaborationInfo = JSON.parse(message.message);
  const userInCollaboration = JSON.parse(
    NativeBridgeDataSource.getUserInfoList(collaborationInfo.userList)
  );
  const displayUserList = ChatRoom.getDisplayUserList(userInCollaboration);
  const meetingID = ChatRoom.getMeetingID(collaborationInfo.meetingId);
  const messageTime = CHAT_UTIL.formatDate(message.insertDate);
  const createdAtYear =
    message.insertDate.substring(0, 4) + getLocalizedString("year") + " ";
  // 協業のタイプを数値から文字列に変換
  const strCollaborationType = CHAT_UTIL.getCollaborationType(
    collaborationInfo.collaborationType
  );

  const html = Mustache.render(collaborationMessageTemplate, {
    messageId: message.messageId,
    roomName: roomName,
    userCount: userInCollaboration.length,
    userList: displayUserList,
    insertDate: message.insertDate,
    // TODO: peacekim:: should check collaborationInfo.collaborationType is string or number
    collaborationType: strCollaborationType,
    meetingId: meetingID,
    isToday: isToday,
    createdAtDay: messageTime.createdAtDay,
    createdAtTime: messageTime.createdAtTime,
    createdAtYear: createdAtYear,
    isOtherYear: isOtherYear,
    isEnded: message.messageType == MessageType.COMMUNICATIONEND ? true : false,
  });
  return message.message.includes("attachedImages") ||
    message.message.includes("attachedVideos")
    ? CHAT_UTIL.htmlDecode(html)
    : html;
};

ChatRoom.getMeetingID = function (meetingID) {
  return typeof meetingID != "undefined" ? 0 : meetingID;
};

ChatRoom.getDisplayUserList = function (userList) {
  userList.forEach(function (user) {
    user.profileUrl = Common.getProfileImgUrl(user.profileUrl);
  });
  return userList.length > 3 ? userList.slice(0, 3) : userList;
};

ChatRoom.renderChatMessage = function (message, isToday, isOtherYear) {
  const template = ChatRoom.getChatMessageTemplate(
    message.messageType,
    message.shopMemberId
  );

  const messageTime = CHAT_UTIL.formatDate(message.insertDate);

  const createdAtYear =
    message.insertDate.substring(0, 4) + getLocalizedString("year") + " ";

  const html = Mustache.render(template, {
    text: message.message,
    from: message.loginId,
    messageId: message.messageId,
    shopMemberId: message.shopMemberId,
    profileImage: message.profileUrl,
    createdAtDay: messageTime.createdAtDay,
    createdAtTime: messageTime.createdAtTime,
    createdAtYear: createdAtYear,
    unreadCount: message.unreadCount,
    isOtherYear: isOtherYear,
    isToday: isToday,
  });
  return message.message.includes("attachedImages") ||
    message.message.includes("attachedVideos")
    ? CHAT_UTIL.htmlDecode(html)
    : html;
};
