use crate::app::AppState;
use crate::git::parsers::status::StatusEntry;
pub fn staged_count(state: &AppState) -> usize {
state.status_entries.iter().filter(|e| e.staged).count()
}
pub fn unstaged_count(state: &AppState) -> usize {
state.status_entries.iter().filter(|e| e.unstaged).count()
}
pub fn has_staged_changes(state: &AppState) -> bool {
state.status_entries.iter().any(|e| e.staged)
}
pub fn has_unstaged_changes(state: &AppState) -> bool {
state.status_entries.iter().any(|e| e.unstaged)
}
pub fn current_branch(state: &AppState) -> Option<&str> {
state.branches.iter()
.find(|b| !b.is_remote)
.map(|b| b.name.as_str())
}
pub fn is_on_main_branch(state: &AppState) -> bool {
current_branch(state)
.map(|b| b == "main" || b == "master")
.unwrap_or(false)
}
pub fn selected_status_entry(state: &AppState) -> Option<&StatusEntry> {
state.status_entries.get(state.status_selected)
}
pub fn selected_commit(state: &AppState) -> Option<&crate::app::state::CommitEntry> {
state.commits.get(state.commit_selected)
}
pub fn status_summary(state: &AppState) -> String {
let staged = staged_count(state);
let unstaged = unstaged_count(state);
let mut parts = Vec::new();
if staged > 0 {
parts.push(format!("{}+", staged));
}
if unstaged > 0 {
parts.push(format!("{}~", unstaged));
}
if parts.is_empty() {
"clean".to_string()
} else {
parts.join(" ")
}
}
pub fn can_commit(state: &AppState) -> bool {
has_staged_changes(state) && !state.commit_input.is_empty()
}
pub fn is_running(state: &AppState) -> bool {
state.running
}