use crate::app::model::Model;
use crate::components::common::{ComponentId, MessageActivityMsg, Msg, PopupActivityMsg};
use quetty_server::bulk_operations::MessageIdentifier;
use quetty_server::model::MessageModel;
use tuirealm::terminal::TerminalAdapter;
impl<T> Model<T>
where
T: TerminalAdapter,
{
fn get_current_message(&self) -> Option<MessageModel> {
if let Ok(tuirealm::State::One(tuirealm::StateValue::Usize(selected_index))) =
self.app.state(&ComponentId::Messages)
{
if let Some(current_messages) = &self.queue_manager.queue_state.messages {
if selected_index < current_messages.len() {
return Some(current_messages[selected_index].clone());
}
}
}
None
}
pub fn handle_bulk_delete_messages(
&mut self,
message_ids: Vec<MessageIdentifier>,
) -> Option<Msg> {
if message_ids.is_empty() {
return None;
}
let count = message_ids.len();
let title = "Delete Messages".to_string();
let selections_contiguous = self
.queue_state()
.bulk_selection
.are_selections_contiguous_from_start();
let is_single_message_at_start = if count == 1 && selections_contiguous {
if let Ok(tuirealm::State::One(tuirealm::StateValue::Usize(selected_index))) =
self.app.state(&ComponentId::Messages)
{
selected_index == 0 } else {
false }
} else {
false };
let mut message = format!(
"You are about to delete {} message{} from the queue.\n\n🗑️ Action: Messages will be permanently removed\n⚠️ Warning: This action CANNOT be undone!",
count,
if count == 1 { "" } else { "s" }
);
if !selections_contiguous || (count == 1 && !is_single_message_at_start) {
message.push_str("\n\n🚨 DELIVERY COUNT WARNING:\n");
message.push_str("Selected messages are not from the beginning of the queue.\n");
message
.push_str("This operation may increase delivery count of messages in between,\n");
message
.push_str("potentially moving them to the Dead Letter Queue if count exceeds 9.");
}
Some(Msg::PopupActivity(PopupActivityMsg::ShowConfirmation {
title,
message,
on_confirm: Box::new(Msg::MessageActivity(
MessageActivityMsg::BulkDeleteMessages(message_ids),
)),
}))
}
pub fn handle_bulk_send_to_dlq_with_delete(
&mut self,
message_ids: Vec<MessageIdentifier>,
) -> Option<Msg> {
if message_ids.is_empty() {
return None;
}
let count = message_ids.len();
let title = "Move to Dead Letter Queue".to_string();
let selections_contiguous = self
.queue_state()
.bulk_selection
.are_selections_contiguous_from_start();
let is_single_message_at_start = if count == 1 && selections_contiguous {
if let Ok(tuirealm::State::One(tuirealm::StateValue::Usize(selected_index))) =
self.app.state(&ComponentId::Messages)
{
selected_index == 0 } else {
false }
} else {
false };
let mut message = format!(
"You are about to move {} message{} to the dead letter queue.\n\n📤 Action: Messages will be moved to the DLQ\n🗑️ Result: Messages will be DELETED from the main queue",
count,
if count == 1 { "" } else { "s" }
);
if !selections_contiguous || (count == 1 && !is_single_message_at_start) {
message.push_str("\n\n🚨 DELIVERY COUNT WARNING:\n");
message.push_str("Selected messages are not from the beginning of the queue.\n");
message
.push_str("This operation may increase delivery count of messages in between,\n");
message
.push_str("potentially moving them to the Dead Letter Queue if count exceeds 9.");
}
Some(Msg::PopupActivity(PopupActivityMsg::ShowConfirmation {
title,
message,
on_confirm: Box::new(Msg::MessageActivity(
MessageActivityMsg::BulkSendToDLQWithDelete(message_ids),
)),
}))
}
pub fn handle_bulk_resend_from_dlq_messages(
&mut self,
message_ids: Vec<MessageIdentifier>,
delete_from_dlq: bool,
) -> Option<Msg> {
if message_ids.is_empty() {
return None;
}
let count = message_ids.len();
let (title, base_message) = if delete_from_dlq {
(
"Resend and Delete from DLQ".to_string(),
format!(
"You are about to resend {} message{} from the DLQ to the main queue.\n\n📤 Action: Messages will be sent to the main queue\n🗑️ Result: Messages will be DELETED from the DLQ",
count,
if count == 1 { "" } else { "s" }
),
)
} else {
(
"Resend Only (Keep in DLQ)".to_string(),
format!(
"You are about to resend {} message{} from the DLQ to the main queue.\n\n📤 Action: Messages will be sent to the main queue\n📄 Result: Messages will REMAIN in the DLQ for future processing",
count,
if count == 1 { "" } else { "s" }
),
)
};
let mut message = base_message;
if delete_from_dlq {
message.push_str("\n\n⚠️ WARNING: Message order may change in the main queue!");
}
let popup_msg = PopupActivityMsg::ShowConfirmation {
title,
message,
on_confirm: Box::new(Msg::MessageActivity(MessageActivityMsg::BulkResendFromDLQ(
message_ids,
delete_from_dlq,
))),
};
Some(Msg::PopupActivity(popup_msg))
}
pub fn handle_bulk_delete_selected(&mut self) -> Option<Msg> {
let selected_messages = self
.queue_manager
.queue_state
.bulk_selection
.get_selected_messages();
if !selected_messages.is_empty() {
return self.handle_bulk_delete_messages(selected_messages);
}
if let Some(current_message) = self.get_current_message() {
let current_message_id = MessageIdentifier::from_message(¤t_message);
return self.handle_bulk_delete_messages(vec![current_message_id]);
}
None
}
pub fn handle_bulk_send_selected_to_dlq_with_delete(&mut self) -> Option<Msg> {
let selected_messages = self
.queue_manager
.queue_state
.bulk_selection
.get_selected_messages();
if !selected_messages.is_empty() {
return self.handle_bulk_send_to_dlq_with_delete(selected_messages);
}
if let Some(current_message) = self.get_current_message() {
let current_message_id = MessageIdentifier::from_message(¤t_message);
return self.handle_bulk_send_to_dlq_with_delete(vec![current_message_id]);
}
None
}
pub fn handle_bulk_resend_selected_from_dlq(&mut self, delete_from_dlq: bool) -> Option<Msg> {
let selected_messages = self
.queue_manager
.queue_state
.bulk_selection
.get_selected_messages();
if !selected_messages.is_empty() {
return self.handle_bulk_resend_from_dlq_messages(selected_messages, delete_from_dlq);
}
if let Some(current_message) = self.get_current_message() {
let current_message_id = MessageIdentifier::from_message(¤t_message);
return self
.handle_bulk_resend_from_dlq_messages(vec![current_message_id], delete_from_dlq);
}
None
}
}