//! UI 渲染：整体布局 + 子模块组合。
//!
//! 布局：
//! ```text
//! ┌── mac-route ────────────── 标题/快捷键 ───┐
//! │ 左侧 IP 段列表        │  右侧绑定详情       │
//! ├─────────────────────────────────────────────┤
//! │ 底部状态栏（日志 / 提示）                     │
//! └─────────────────────────────────────────────┘
//! ```
//! 弹窗覆盖在主界面上层。

pub mod detail;
pub mod popup;
pub mod sidebar;

use ratatui::layout::{Constraint, Direction, Layout};
use ratatui::style::{Color, Modifier, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Borders, Paragraph};
use ratatui::Frame;

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

/// 主入口：根据当前模式绘制。
pub fn draw(f: &mut Frame, app: &mut App) {
    let area = f.area();

    // 整体垂直：主区 + 底部状态栏
    let chunks = Layout::default()
        .direction(Direction::Vertical)
        .constraints([Constraint::Min(5), Constraint::Length(2)])
        .split(area);

    let main = chunks[0];
    let status_bar = chunks[1];

    // 主区：左右两栏
    let main_cols = Layout::default()
        .direction(Direction::Horizontal)
        .constraints([Constraint::Percentage(45), Constraint::Percentage(55)])
        .split(main);

    sidebar::draw(f, app, main_cols[0]);
    detail::draw(f, app, main_cols[1]);

    draw_status_bar(f, app, status_bar);

    // 弹窗最后绘制，覆盖在上层
    match &app.mode {
        Mode::AddRoute(_) => popup::draw_add_route(f, app),
        Mode::DeleteConfirm {
            binding_idx,
            service_idx_in_binding,
        } => popup::draw_delete_confirm(f, app, *binding_idx, *service_idx_in_binding),
        Mode::Help => popup::draw_help(f),
        Mode::Error => popup::draw_error(f, app),
        Mode::Normal => {}
    }
}

/// 顶部标题 + 底部状态栏。
fn draw_status_bar(f: &mut Frame, app: &App, area: ratatui::layout::Rect) {
    // 顶部快捷键提示
    let title_line = Line::from(vec![
        Span::styled(
            " mac-route ",
            Style::default()
                .fg(Color::Cyan)
                .add_modifier(Modifier::BOLD),
        ),
        Span::raw(" "),
        Span::styled(
            "[r]刷新  [a]添加  [d]删除  [?]帮助  [q]退出",
            Style::default().fg(Color::DarkGray),
        ),
    ]);

    let mut lines = vec![title_line];

    // 日志/提示行
    let hint = app
        .logs
        .last()
        .cloned()
        .unwrap_or_else(|| "使用 ↑↓ 选择 IP 段，←→ 选择绑定，d 删除，a 添加".to_string());
    lines.push(Line::from(vec![
        Span::styled(
            " › ",
            Style::default().fg(Color::Green),
        ),
        Span::styled(hint, Style::default().fg(Color::Gray)),
    ]));

    let para = Paragraph::new(lines).block(Block::default().borders(Borders::TOP));
    f.render_widget(para, area);
}
