trackWork 0.13.0

A terminal-based time tracking application for managing work sessions
use anyhow::Result;
use crossterm::event::{KeyCode, KeyEvent, KeyModifiers};

use crate::app::{App, InputMode};

/// Handle keyboard input for the full-screen weekly summary view.
/// Two states: browsing days/fields, or editing the highlighted field.
pub fn handle_week_summary_input(app: &mut App, key: KeyEvent) -> Result<bool> {
    let editing = matches!(
        &app.input_mode,
        InputMode::WeekSummary { editing: Some(_), .. }
    );
    if editing {
        handle_edit(app, key)
    } else {
        handle_browse(app, key)
    }
}

fn handle_browse(app: &mut App, key: KeyEvent) -> Result<bool> {
    let shift = key.modifiers.contains(KeyModifiers::SHIFT);
    match key.code {
        KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('Q') => {
            app.input_mode = InputMode::Normal;
        }
        KeyCode::Left if shift => app.week_change_week(-1),
        KeyCode::Right if shift => app.week_change_week(1),
        KeyCode::Left => app.week_select_day(-1),
        KeyCode::Right => app.week_select_day(1),
        KeyCode::Up => app.week_move_field(-1),
        KeyCode::Down => app.week_move_field(1),
        KeyCode::Enter => app.week_open_day()?,
        KeyCode::Char('e') | KeyCode::Char('E') => app.week_begin_edit(),
        _ => {}
    }
    Ok(false)
}

fn handle_edit(app: &mut App, key: KeyEvent) -> Result<bool> {
    match key.code {
        KeyCode::Esc => app.week_edit_cancel(),
        KeyCode::Enter => app.week_edit_save()?,
        KeyCode::Tab => app.week_edit_tab(),
        KeyCode::Up => app.week_edit_adjust(-1),
        KeyCode::Down => app.week_edit_adjust(1),
        KeyCode::Backspace => app.week_edit_backspace(),
        KeyCode::Char(c) => app.week_edit_input(c),
        _ => {}
    }
    Ok(false)
}