1use crate::storage::save_tasks_to_file;
2use crate::task::Task;
3use chrono::DateTime;
4use chrono::offset::Utc;
5use colored::*;
6
7pub fn add_task(tasks: &mut Vec<Task>, text: String, date_string: Option<String>, file: &str) {
8 let date = date_string.unwrap_or_else(|| "".to_string()); let new_task = Task::new(text.clone(), date.clone());
10 tasks.push(new_task.clone());
11 save_tasks_to_file(tasks, file);
12
13 if date.is_empty() {
14 println!("Added: {}", text.green());
15 println!("Tip: You can also add a due date later using:");
16 println!(" tasky-cli edit <index> \"<new_text>\" OR");
17 println!(" tasky-cli add \"task\" \"YYYY-MM-DD\"");
18 } else {
19 println!("Added: {} --due {}", text.green(), date.blue());
20 }
21}
22
23pub fn list_tasks(tasks: &[Task]) {
24 if tasks.is_empty() {
25 println!("No tasks yet!");
26 } else {
27 let now: DateTime<Utc> = Utc::now();
28 let current_date = now.format("%Y-%m-%d").to_string();
29
30 for (i, task) in tasks.iter().enumerate() {
31 let status = if task.done { "[X]" } else { "[ ]" };
32
33 if let Some(date) = &task.date_string {
34 let (task_text, date_text) = if current_date > *date {
35 (task.text.blue(), date.red())
36 } else {
37 (task.text.blue(), date.yellow())
38 };
39 println!("{}: {} {} due {}", i, status, task_text, date_text);
40 } else {
41 println!("{}: {} {}", i, status, task.text.blue());
42 }
43 }
44 }
45}
46
47pub fn remove_task(tasks: &mut Vec<Task>, index: usize, file: &str) {
48 if index < tasks.len() {
49 let task = tasks.remove(index);
50 save_tasks_to_file(tasks, file);
51 println!("Removed: {}", task.text.red());
52 } else {
53 println!("Error: Invalid index {}", index);
54 }
55}
56
57pub fn done_task(tasks: &mut Vec<Task>, index: usize, file: &str) {
58 if index < tasks.len() {
59 tasks[index].mark_done();
60 save_tasks_to_file(tasks, file);
61 println!("Marked as done: {}", tasks[index].text.green());
62 } else {
63 println!("Error: Invalid index {}", index);
64 }
65}
66
67pub fn edit_task(tasks: &mut Vec<Task>, index: usize, new_text: String, file: &str) {
68 if index < tasks.len() {
69 let old_text = tasks[index].text.clone();
70 tasks[index].text = new_text.clone();
71 save_tasks_to_file(tasks, file);
72 println!(
73 "Edited task {}: '{}' -> '{}'",
74 index,
75 old_text.yellow(),
76 new_text.green()
77 );
78 } else {
79 println!("Error: Invalid index {index}");
80 }
81}