trackWork 0.15.0

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

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

pub fn handle_tasks_input(app: &mut App, key: KeyEvent) -> Result<bool> {
    if let InputMode::Tasks { confirm_delete, editing, .. } = &app.input_mode {
        if *confirm_delete {
            return handle_confirm_delete(app, key);
        }
        if editing.is_some() {
            return handle_edit_mode(app, key);
        }
    }
    handle_browse_mode(app, key)
}

fn handle_browse_mode(app: &mut App, key: KeyEvent) -> Result<bool> {
    match key.code {
        KeyCode::Esc | KeyCode::Char('q') => {
            app.input_mode = InputMode::Normal;
            Ok(false)
        }
        KeyCode::Up => {
            if let InputMode::Tasks { selected_index, tasks, .. } = &mut app.input_mode {
                if !tasks.is_empty() {
                    *selected_index = if *selected_index == 0 {
                        tasks.len() - 1
                    } else {
                        *selected_index - 1
                    };
                }
            }
            Ok(false)
        }
        KeyCode::Down => {
            if let InputMode::Tasks { selected_index, tasks, .. } = &mut app.input_mode {
                if !tasks.is_empty() {
                    *selected_index = (*selected_index + 1) % tasks.len();
                }
            }
            Ok(false)
        }
        KeyCode::Char('n') => {
            app.tasks_start_creating();
            Ok(false)
        }
        KeyCode::Char('e') => {
            app.tasks_start_editing();
            Ok(false)
        }
        KeyCode::Char('d') => {
            app.tasks_confirm_delete();
            Ok(false)
        }
        _ => Ok(false),
    }
}

fn handle_edit_mode(app: &mut App, key: KeyEvent) -> Result<bool> {
    match key.code {
        KeyCode::Esc => {
            app.tasks_cancel_edit();
            Ok(false)
        }
        KeyCode::Enter => {
            app.tasks_save()?;
            Ok(false)
        }
        KeyCode::Tab => {
            if let InputMode::Tasks { editing, .. } = &mut app.input_mode {
                if let Some(edit) = editing {
                    edit.current_field = (edit.current_field + 1) % 3;
                }
            }
            Ok(false)
        }
        KeyCode::Char(c) => {
            if let InputMode::Tasks { editing, .. } = &mut app.input_mode {
                if let Some(edit) = editing {
                    match edit.current_field {
                        0 => edit.issue_key.push(c),
                        1 => edit.name.push(c),
                        2 => edit.project.push(c),
                        _ => {}
                    }
                }
            }
            Ok(false)
        }
        KeyCode::Backspace => {
            if let InputMode::Tasks { editing, .. } = &mut app.input_mode {
                if let Some(edit) = editing {
                    match edit.current_field {
                        0 => { edit.issue_key.pop(); }
                        1 => { edit.name.pop(); }
                        2 => { edit.project.pop(); }
                        _ => {}
                    }
                }
            }
            Ok(false)
        }
        _ => Ok(false),
    }
}

fn handle_confirm_delete(app: &mut App, key: KeyEvent) -> Result<bool> {
    match key.code {
        KeyCode::Char('y') | KeyCode::Char('Y') => {
            app.tasks_delete()?;
            Ok(false)
        }
        _ => {
            app.tasks_cancel_delete();
            Ok(false)
        }
    }
}