use crate::app::{self, App, InputMode};
use crate::input::Action;
use travelagent_core::persistence::save_session;
pub fn open_mental_model_modal(app: &mut App) {
let drafts = match app.engine.session().mental_model.as_ref() {
Some(mm) => [
mm.should_do.clone(),
mm.shouldnt_do.clone(),
mm.could_go_wrong.clone(),
mm.assumptions.clone(),
],
None => Default::default(),
};
app.mental_model_edit = app::MentalModelEditState { drafts, focused: 0 };
app.nav.input_mode = InputMode::MentalModelEdit;
}
pub fn handle_mental_model_edit_action(app: &mut App, action: Action) {
match action {
Action::MentalModelCancel => {
app.mental_model_edit = app::MentalModelEditState::default();
app.nav.input_mode = InputMode::Normal;
}
Action::MentalModelSave => {
use travelagent_core::model::MentalModel;
let now = chrono::Utc::now();
let drafts = app.mental_model_edit.drafts.clone();
app.engine.session_mut().commit_mental_model(
MentalModel {
should_do: drafts[0].clone(),
shouldnt_do: drafts[1].clone(),
could_go_wrong: drafts[2].clone(),
assumptions: drafts[3].clone(),
created_at: now,
updated_at: now,
},
now,
);
app.dirty = true;
if let Err(err) = save_session(app.engine.session()) {
app.set_error(format!("failed to persist mental model: {err}"));
return;
}
app.mental_model_edit = app::MentalModelEditState::default();
app.nav.input_mode = InputMode::Normal;
}
Action::MentalModelNextField => {
app.mental_model_edit.focused =
(app.mental_model_edit.focused + 1) % app.mental_model_edit.drafts.len();
}
Action::MentalModelPrevField => {
let n = app.mental_model_edit.drafts.len();
app.mental_model_edit.focused = (app.mental_model_edit.focused + n - 1) % n;
}
Action::MentalModelInsertChar(c) => {
let focused = app.mental_model_edit.focused;
let buf = &mut app.mental_model_edit.drafts[focused];
if buf.len() + c.len_utf8() <= app.mental_model_byte_limit {
buf.push(c);
}
}
Action::MentalModelBackspace => {
let focused = app.mental_model_edit.focused;
let _ = app.mental_model_edit.drafts[focused].pop();
}
_ => {}
}
}