use crate::wordle::model::{LetterState, LetterStatus, Model};
use ratatui::{prelude::*, widgets::*};
use super::get_grid_color;
pub fn draw(frame: &mut Frame, rect: Rect, model: &mut Model) {
for row in 0..=5 {
for column in 0..5 {
render(
frame,
rect,
Grid {
row,
column,
letter_status: LetterStatus {
letter: ' ',
status: LetterState::Unknown,
},
},
);
}
}
for (row, guess) in model.guesses.iter().enumerate() {
for (column, guess_status) in guess.into_iter().enumerate() {
let grid = Grid {
row,
column,
letter_status: guess_status.clone(),
};
render(frame, rect, grid);
}
}
if model.active_guess.len() > 0 {
let row = model.guesses.len();
for (column, letter) in model.active_guess.chars().enumerate() {
let grid = Grid {
row,
column,
letter_status: LetterStatus {
letter,
status: LetterState::Unknown,
},
};
render(frame, rect, grid);
}
}
}
struct Grid {
row: usize,
column: usize,
letter_status: LetterStatus,
}
fn render(frame: &mut Frame, rect: Rect, grid: Grid) {
let width = 5;
let height = 3;
let row = grid.row;
let column = grid.column;
let letter = grid.letter_status.letter.to_uppercase().to_string();
let offset: u16 = u16::from((rect.width - rect.left()) / 2) - 12;
let x = rect.left() + u16::from(column as u16) * width + offset;
let area = Rect {
x,
y: rect.top() + (row as u16 * height) + 1,
width,
height,
};
let bg = get_grid_color(grid.letter_status.status);
let block = Block::new()
.borders(Borders::ALL)
.border_type(BorderType::QuadrantOutside)
.border_style(Style::new().fg(Color::Rgb(0, 0, 0)))
.style(Style::new().white().on_black().bg(bg).bold());
frame.render_widget(
Paragraph::new(format!("{}", letter.to_string()))
.block(block)
.style(Style::new().white().on_black().bg(bg))
.alignment(Alignment::Center),
area,
);
}