use std::path::Path;
use super::super::ShellState;
use super::super::wire::Said;
use super::{rail, reads, work};
use crate::AppModel;
use crate::inspector::TabData;
use crate::keymap::InspectorTab;
use crate::nav::convs::Selection;
use crate::steps_view::StepsView;
pub(super) fn tab_data(
active: InspectorTab,
model: &mut AppModel,
state: &mut ShellState,
ws: &Path,
focus: &Selection,
) -> (TabData, Vec<String>) {
let agent_id = focus.agent_id.clone();
let speaker = focus.name.clone();
let mut said = Said::default();
let steps: StepsView = said
.take(reads::steps(model, ws, &agent_id))
.unwrap_or_default();
let live = std::sync::Arc::new(
said.take(reads::transcript(model, ws, &agent_id))
.unwrap_or_default(),
);
let history = said
.take(reads::rail(model, ws, &agent_id))
.unwrap_or_default();
let pin = rail::pinned(&history, state.inspector.eph.notch_sel);
let commit = pin.as_ref().map(|p| p.commit.clone());
let files = (active == InspectorTab::Files)
.then(|| {
said.take(reads::files(
model,
ws,
&agent_id,
state.inspector.eph.files_sel.clone(),
commit.clone(),
))
})
.flatten()
.unwrap_or_default();
let step_detail = detail_seq(active, &steps, state.inspector.step_sel)
.and_then(|seq| said.take(reads::detail(model, ws, &agent_id, &seq)));
let inbox = (active == InspectorTab::Inbox)
.then(|| said.take(reads::inbox(model, ws, &agent_id)))
.flatten()
.unwrap_or_default();
let governing = (active == InspectorTab::Config)
.then(|| said.take(reads::governing(model, ws, &agent_id, commit)))
.flatten();
let picked = state.inspector.eph.work_sel.clone();
let work = work::read(active, model, ws, picked, &mut said);
let data = TabData {
transcript: rail::transcript(&live, pin.as_ref()),
speaker,
raw: state.inspector.raw,
auto: model.transcript_auto_expand(),
step_sel: state.inspector.step_sel,
step_detail,
step_tab: state.inspector.step_tab,
steps,
inbox,
file_preview: files.1,
files: files.0,
work: work.attempts,
work_patch: work.patch,
governing,
rail: history,
pin,
};
(data, said.sentences())
}
fn detail_seq(tab: InspectorTab, steps: &StepsView, sel: Option<usize>) -> Option<String> {
(tab == InspectorTab::Steps)
.then(|| steps.steps.get(sel?).map(|step| step.seq.clone()))
.flatten()
}