Fix issue with incorrect last message extraction

Occasionally, the last message in a history (intended for forwarding to
ChatGPT in stateless mode) is from the assistant rather than the user.
This update ensures that the last message extracted and forwarded is
always the user's.

Change-Id: I630b821188b8e7d9f4bbd49788edb4e6f05fe98a
Signed-off-by: Patrizio <patrizio.gelosi@amarulasolutions.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java
index 74d1269..1bf8c3a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java
@@ -16,9 +16,6 @@
 
 @Slf4j
 public class ChatGptHistory extends ChatGptComment {
-    private static final String ROLE_USER = "user";
-    private static final String ROLE_ASSISTANT = "assistant";
-
     private final Set<String> messagesExcludedFromHistory;
     private final HashMap<String, GerritComment> commentMap;
     private final HashMap<String, GerritComment> patchSetCommentMap;
@@ -89,7 +86,7 @@
     }
 
     private String getRoleFromComment(GerritComment currentComment) {
-        return isFromAssistant(currentComment) ? ROLE_ASSISTANT : ROLE_USER;
+        return isFromAssistant(currentComment) ? Settings.CHAT_GPT_ROLE_ASSISTANT : Settings.CHAT_GPT_ROLE_USER;
     }
 
     private List<ChatGptRequestMessage> retrieveMessageHistory(GerritComment currentComment) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java
index 95b931b..3c1e376 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java
@@ -63,9 +63,9 @@
         return messageItem;
     }
 
-    protected void setHistories(ChatGptMessageItem messageItem, List<ChatGptRequestMessage> messageHistories) {
-        if (!messageHistories.isEmpty()) {
-            messageItem.setHistory(messageHistories);
+    protected void setHistory(ChatGptMessageItem messageItem, List<ChatGptRequestMessage> messageHistory) {
+        if (!messageHistory.isEmpty()) {
+            messageItem.setHistory(messageHistory);
         }
     }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java
index 2a3b214..4ccd5f1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java
@@ -10,10 +10,12 @@
 
 import java.util.List;
 
+import static com.googlesource.gerrit.plugins.chatgpt.settings.Settings.CHAT_GPT_ROLE_USER;
+
 @Slf4j
 public class ChatGptUserPromptRequests extends ChatGptUserPromptBase {
     protected ChatGptMessageItem messageItem;
-    protected List<ChatGptRequestMessage> messageHistories;
+    protected List<ChatGptRequestMessage> messageHistory;
 
     public ChatGptUserPromptRequests(
             Configuration config,
@@ -33,10 +35,20 @@
 
     protected ChatGptMessageItem getMessageItem(int i) {
         messageItem = super.getMessageItem(i);
-        messageHistories = gptMessageHistory.retrieveHistory(commentProperties.get(i));
-        ChatGptRequestMessage request = messageHistories.remove(messageHistories.size() -1);
+        messageHistory = gptMessageHistory.retrieveHistory(commentProperties.get(i));
+        ChatGptRequestMessage request = extractLastUserMessageFromHistory();
         messageItem.setRequest(request.getContent());
 
         return messageItem;
     }
+
+    private ChatGptRequestMessage extractLastUserMessageFromHistory() {
+        for (int i = messageHistory.size() - 1; i >= 0; i--) {
+            if (CHAT_GPT_ROLE_USER.equals(messageHistory.get(i).getRole())) {
+                return messageHistory.remove(i);
+            }
+        }
+        throw new RuntimeException("Error extracting request from message history: no user message found in " +
+                messageHistory);
+    }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java
index f307e58..acc51c0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java
@@ -33,9 +33,9 @@
 
     protected ChatGptMessageItem getMessageItem(int i) {
         ChatGptMessageItem messageItem = super.getMessageItem(i);
-        List<ChatGptRequestMessage> messageHistories = gptMessageHistory.retrieveHistory(commentProperties.get(i),
+        List<ChatGptRequestMessage> messageHistory = gptMessageHistory.retrieveHistory(commentProperties.get(i),
                 true);
-        setHistories(messageItem, messageHistories);
+        setHistory(messageItem, messageHistory);
 
         return messageItem;
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptUserPromptRequestsStateless.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptUserPromptRequestsStateless.java
index e792f11..a071116 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptUserPromptRequestsStateless.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptUserPromptRequestsStateless.java
@@ -22,7 +22,7 @@
 
     protected ChatGptMessageItem getMessageItem(int i) {
         super.getMessageItem(i);
-        setHistories(messageItem, messageHistories);
+        setHistory(messageItem, messageHistory);
 
         return messageItem;
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/settings/Settings.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/settings/Settings.java
index 6a25733..091355c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/settings/Settings.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/settings/Settings.java
@@ -16,6 +16,9 @@
     );
     public static final String GERRIT_COMMIT_MESSAGE_PREFIX = "Subject: ";
 
+    public static final String CHAT_GPT_ROLE_USER = "user";
+    public static final String CHAT_GPT_ROLE_ASSISTANT = "assistant";
+
     public enum MODES {
         stateless,
         stateful
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java
index a8b8ec2..b28bb7e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java
@@ -187,7 +187,7 @@
                 ChatGptPromptStateless.DEFAULT_GPT_REQUEST_PROMPT_DIFF,
                 diffContent,
                 ChatGptPromptStateless.DEFAULT_GPT_REQUEST_PROMPT_REQUESTS,
-                promptTagComments,
+                readTestFile("__files/stateless/chatGptExpectedRequestMessage.json"),
                 ChatGptPromptStateless.getCommentRequestUserPrompt(commentPropertiesSize)
         ));
         testRequestSent();
diff --git a/src/test/resources/__files/stateful/chatGptPromptTagRequests.json b/src/test/resources/__files/stateful/chatGptPromptTagRequests.json
index 4ab9486..106dfd4 100644
--- a/src/test/resources/__files/stateful/chatGptPromptTagRequests.json
+++ b/src/test/resources/__files/stateful/chatGptPromptTagRequests.json
@@ -1 +1 @@
-[{"request":"How about something like \"Corrected Indentation in Module-Class Retrieval Line\"?","id":0},{"request":"message","id":1},{"request":"message 2","id":2}]
\ No newline at end of file
+[{"request":"can you suggest an alternative commit message?","id":0},{"request":"message","id":1},{"request":"message 2","id":2}]
\ No newline at end of file
diff --git a/src/test/resources/__files/stateless/chatGptExpectedRequestMessage.json b/src/test/resources/__files/stateless/chatGptExpectedRequestMessage.json
new file mode 100644
index 0000000..f6e01d6
--- /dev/null
+++ b/src/test/resources/__files/stateless/chatGptExpectedRequestMessage.json
@@ -0,0 +1 @@
+[{"request":"can you suggest an alternative commit message?","history":[{"role":"user","content":"comment"},{"role":"user","content":"comment 2"},{"role":"assistant","content":"The commit message \u0027Minor Fixes\u0027 is too vague and does not provide enough context about the changes made. A more descriptive message that outlines the specific fixes or improvements would be beneficial."},{"role":"assistant","content":"How about something like \"Corrected Indentation in Module-Class Retrieval Line\"?"}],"id":0},{"request":"message","id":1,"filename":"test_file.py","lineNumber":5,"codeSnippet":"TypeClassOrPath"},{"request":"message 2","history":[{"role":"assistant","content":"message from gpt"}],"id":2,"filename":"test_file.py","lineNumber":5,"codeSnippet":"TypeClassOrPath"}]
\ No newline at end of file