use std::io::{self, Write};
use crate::error::EnvelopeResult;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CategoryChoice {
UseDefaults,
Customize,
Empty,
}
pub struct CategoriesSetupResult {
pub choice: CategoryChoice,
}
pub struct CategoriesSetupStep;
impl CategoriesSetupStep {
pub fn run() -> EnvelopeResult<CategoriesSetupResult> {
println!();
println!("Step 2: Category Groups");
println!("=======================");
println!();
println!("EnvelopeCLI organizes your budget into category groups.");
println!();
println!("Default groups include:");
println!(" - Bills: Rent/Mortgage, Electric, Water, Internet, Phone, Insurance");
println!(" - Needs: Groceries, Transportation, Medical, Household");
println!(" - Wants: Dining Out, Entertainment, Shopping, Subscriptions");
println!(" - Savings: Emergency Fund, Vacation, Large Purchases");
println!();
println!("What would you like to do?");
println!(" 1. Use default categories (recommended)");
println!(" 2. Start with empty categories (add your own later)");
println!();
let choice_str = prompt_string("Select option [1]: ")?;
let choice = match choice_str.trim() {
"" | "1" => CategoryChoice::UseDefaults,
"2" => CategoryChoice::Empty,
_ => CategoryChoice::UseDefaults,
};
match choice {
CategoryChoice::UseDefaults => {
println!();
println!("Default categories will be created.");
}
CategoryChoice::Empty => {
println!();
println!("Starting with empty categories.");
println!("Use 'envelope category create' to add categories later.");
}
CategoryChoice::Customize => {
println!();
println!("Category customization will be available in a future update.");
println!("Using default categories for now.");
}
}
Ok(CategoriesSetupResult { choice })
}
}
fn prompt_string(prompt: &str) -> EnvelopeResult<String> {
print!("{}", prompt);
io::stdout().flush()?;
let mut input = String::new();
io::stdin().read_line(&mut input)?;
Ok(input.trim().to_string())
}