use ratatui::buffer::Buffer;
use ratatui::layout::Rect;
use ratatui::style::{Color, Style};
use ratatui::widgets::Widget;

use crate::editor::Editor;
use crate::input::mode::Mode;

pub struct CommandLine<'a> {
    editor: &'a Editor,
}

impl<'a> CommandLine<'a> {
    pub fn new(editor: &'a Editor) -> Self {
        Self { editor }
    }
}

impl Widget for CommandLine<'_> {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let (text, style, show_cursor) = match self.editor.mode {
            Mode::Command => (
                format!(":{}", self.editor.command_buffer),
                Style::default().fg(Color::White),
                true,
            ),
            Mode::Search => (
                format!("/{}", self.editor.search_query),
                Style::default().fg(Color::White),
                true,
            ),
            _ => {
                if let Some(msg) = &self.editor.status_message {
                    (msg.clone(), Style::default().fg(Color::DarkGray), false)
                } else {
                    (String::new(), Style::default().fg(Color::DarkGray), false)
                }
            }
        };

        for (i, ch) in text.chars().enumerate() {
            let x = area.x + i as u16;
            if x < area.right() {
                buf[(x, area.y)].set_char(ch).set_style(style);
            }
        }

        if show_cursor {
            let cursor_x = area.x + text.len() as u16;
            if cursor_x < area.right() {
                buf[(cursor_x, area.y)]
                    .set_char(' ')
                    .set_style(Style::default().bg(Color::White));
            }
        }
    }
}
