v2rmp 0.4.3

rmpca — Route Optimization TUI & Agent Engine
Documentation
use ratatui::Frame;

use crate::app::App;

pub fn draw(f: &mut Frame, app: &App, area: ratatui::layout::Rect) {
    let inner = super::draw_panel(f, "VRP Optimization", area);


    let cyan = ratatui::style::Color::Cyan;
    let yellow = ratatui::style::Color::Yellow;
    let gray = ratatui::style::Color::DarkGray;
    let green = ratatui::style::Color::Green;

    let input_display = match &app.vrp_input_file {
        Some(p) => ratatui::text::Span::styled(p.clone(), ratatui::style::Style::default().fg(green)),
        None => ratatui::text::Span::styled(
            "(not set)".to_string(),
            ratatui::style::Style::default().fg(yellow),
        ),
    };

    let waypoints_display = match &app.vrp_waypoints_file {
        Some(p) => ratatui::text::Span::styled(p.clone(), ratatui::style::Style::default().fg(green)),
        None => ratatui::text::Span::styled(
            "(not set)".to_string(),
            ratatui::style::Style::default().fg(gray),
        ),
    };

    let depots_display = if app.vrp_depots.is_empty() {
        ratatui::text::Span::styled("(none)".to_string(), ratatui::style::Style::default().fg(yellow))
    } else {
        ratatui::text::Span::styled(
            app.vrp_depots.join(", "),
            ratatui::style::Style::default().fg(green),
        )
    };

    let capacity_display = match app.vrp_capacity {
        Some(c) => ratatui::text::Span::styled(format!("{:.1}", c), ratatui::style::Style::default().fg(yellow)),
        None => ratatui::text::Span::styled("(unlimited)", ratatui::style::Style::default().fg(gray)),
    };

    let status_text = format!("Status: {}", app.vrp_status);
    let status_color = app.vrp_status.color();

    let lines = vec![
        ratatui::text::Line::from(ratatui::text::Span::styled(
            "VRP Solver — Multi-Vehicle Route Planning",
            ratatui::style::Style::default()
                .fg(cyan)
                .add_modifier(ratatui::style::Modifier::BOLD),
        )),
        ratatui::text::Line::from(""),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Input (.rmp):      "),
            input_display,
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Waypoints File:    "),
            waypoints_display,
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Output Directory:  "),
            ratatui::text::Span::styled(
                app.vrp_output_dir.clone(),
                ratatui::style::Style::default().fg(yellow),
            ),
        ]),
        ratatui::text::Line::from(""),
        ratatui::text::Line::from(ratatui::text::Span::styled(
            status_text,
            ratatui::style::Style::default().fg(status_color),
        )),
        ratatui::text::Line::from(""),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Vehicles:          "),
            ratatui::text::Span::styled(
                app.vrp_vehicles.to_string(),
                ratatui::style::Style::default().fg(yellow),
            ),
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Algorithm:         "),
            ratatui::text::Span::styled(
                app.vrp_algo.clone(),
                ratatui::style::Style::default().fg(yellow),
            ),
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Capacity:          "),
            capacity_display,
        ]),
        ratatui::text::Line::from(vec![
            ratatui::text::Span::raw("Depots (lat,lon):  "),
            depots_display,
        ]),
        ratatui::text::Line::from(""),
        ratatui::text::Line::from(ratatui::text::Span::raw(
            "────────────────────────────────────",
        )),
        ratatui::text::Line::from(""),
        ratatui::text::Line::from(ratatui::text::Span::styled(
            "Controls:",
            ratatui::style::Style::default().fg(cyan),
        )),
        ratatui::text::Line::from("  [I]  Set input .rmp file"),
        ratatui::text::Line::from("  [W]  Set waypoints JSON file"),
        ratatui::text::Line::from("  [O]  Set output directory"),
        ratatui::text::Line::from("  [V]  Set number of vehicles"),
        ratatui::text::Line::from("  [A]  Change algorithm (greedy|savings|local_search|simulated_annealing)"),
        ratatui::text::Line::from("  [C]  Set vehicle capacity"),
        ratatui::text::Line::from("  [D]  Add depot (lat,lon)"),
        ratatui::text::Line::from("  [X]  Clear all depots"),
        ratatui::text::Line::from("  [Enter]  Run VRP solver"),
        ratatui::text::Line::from("  [Esc]  Return to home"),
    ];

    let paragraph = ratatui::widgets::Paragraph::new(lines);
    f.render_widget(paragraph, inner);

    super::draw_input_prompt(f, app, area);
}