use ratatui::Frame;
use crate::app::App;
pub fn draw(f: &mut Frame, app: &App, area: ratatui::layout::Rect) {
let block = ratatui::widgets::Block::default()
.title(" Extract Data ")
.borders(ratatui::widgets::Borders::ALL)
.border_style(ratatui::style::Style::default().fg(ratatui::style::Color::Cyan));
let inner = block.inner(area);
f.render_widget(block, area);
let cyan = ratatui::style::Color::Cyan;
let yellow = ratatui::style::Color::Yellow;
let green = ratatui::style::Color::Green;
let gray = ratatui::style::Color::DarkGray;
let magenta = ratatui::style::Color::Magenta;
let bbox_text = match &app.bounding_box {
Some(bb) => format!("Set: {}", bb),
None => "Not set (press 'b' to set)".to_string(),
};
let status_text = format!("Status: {}", app.extract_status);
let status_color = match &app.extract_status {
crate::app::Status::Ready => gray,
crate::app::Status::Running { .. } => magenta,
crate::app::Status::Done(_) => green,
crate::app::Status::Error(_) => ratatui::style::Color::Red,
};
let lines = vec![
ratatui::text::Line::from(ratatui::text::Span::styled(
"Extract Data",
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("Data Source: "),
ratatui::text::Span::styled(
app.data_source.to_string(),
ratatui::style::Style::default().fg(yellow),
),
]),
ratatui::text::Line::from(vec![
ratatui::text::Span::raw("Bounding Box: "),
ratatui::text::Span::styled(
bbox_text,
ratatui::style::Style::default().fg(green),
),
]),
];
let mut lines = lines;
if app.data_source == crate::app::DataSource::Postgres {
lines.push(ratatui::text::Line::from(vec![
ratatui::text::Span::raw("Database URL: "),
ratatui::text::Span::styled(
app.database_url.as_deref().unwrap_or("Not set (press 'u' to set)"),
ratatui::style::Style::default().fg(yellow),
),
]));
lines.push(ratatui::text::Line::from(vec![
ratatui::text::Span::raw("Table Name: "),
ratatui::text::Span::styled(
app.table_name.as_deref().unwrap_or("roads (press 't' to set)"),
ratatui::style::Style::default().fg(yellow),
),
]));
}
if app.data_source == crate::app::DataSource::R2 {
lines.push(ratatui::text::Line::from(vec![
ratatui::text::Span::raw("Bucket: "),
ratatui::text::Span::styled(
app.r2_bucket.as_deref().unwrap_or("Not set (press 'k' to set)"),
ratatui::style::Style::default().fg(yellow),
),
]));
lines.push(ratatui::text::Line::from(vec![
ratatui::text::Span::raw("Endpoint: "),
ratatui::text::Span::styled(
app.r2_endpoint.as_deref().unwrap_or("Not set (press 'e' to set)"),
ratatui::style::Style::default().fg(yellow),
),
]));
lines.push(ratatui::text::Line::from(vec![
ratatui::text::Span::raw("Access Key: "),
ratatui::text::Span::styled(
if app.r2_access_key_id.is_some() { "********" } else { "Not set (press 'a' to set)" },
ratatui::style::Style::default().fg(yellow),
),
]));
}
lines.extend(vec![
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(" [Tab/S] Toggle data source (OSM <-> Overture <-> Postgres <-> R2)"),
ratatui::text::Line::from(" [B] Set bounding box (enter coordinates)"),
]);
if app.data_source == crate::app::DataSource::Postgres {
lines.push(ratatui::text::Line::from(" [U] Set Database URL"));
lines.push(ratatui::text::Line::from(" [T] Set Table Name"));
}
if app.data_source == crate::app::DataSource::R2 {
lines.push(ratatui::text::Line::from(" [K] Set Bucket Name"));
lines.push(ratatui::text::Line::from(" [E] Set Endpoint URL"));
lines.push(ratatui::text::Line::from(" [A] Set Access Key ID"));
lines.push(ratatui::text::Line::from(" [X] Set Secret Access Key"));
}
lines.extend(vec![
ratatui::text::Line::from(" [Enter] Start extraction"),
ratatui::text::Line::from(" [Esc] Return to home"),
ratatui::text::Line::from(""),
ratatui::text::Line::from(ratatui::text::Span::styled(
status_text,
ratatui::style::Style::default().fg(status_color),
)),
]);
let paragraph = ratatui::widgets::Paragraph::new(lines);
f.render_widget(paragraph, inner);
super::draw_input_prompt(f, app, area);
}