use dotmax::primitives::{
draw_polygon, draw_polygon_filled, draw_rectangle, draw_rectangle_filled, draw_rectangle_thick,
};
use dotmax::{BrailleGrid, TerminalRenderer};
fn main() -> Result<(), dotmax::DotmaxError> {
println!("dotmax - Shapes Demo");
println!("====================\n");
let mut grid = BrailleGrid::new(80, 24)?;
println!("Demo 1: Small Rectangle Outline (20×15 dots)");
draw_rectangle(&mut grid, 10, 5, 20, 15)?;
println!("Demo 2: Medium Rectangle Outline (30×20 dots)");
draw_rectangle(&mut grid, 40, 5, 30, 20)?;
println!("Demo 3: Large Rectangle Outline (50×25 dots)");
draw_rectangle(&mut grid, 80, 5, 50, 25)?;
println!("Demo 4: Filled Rectangle (15×10 dots solid)");
draw_rectangle_filled(&mut grid, 10, 30, 15, 10)?;
println!("Demo 5: Filled Rectangle (25×15 dots background)");
draw_rectangle_filled(&mut grid, 35, 30, 25, 15)?;
println!("Demo 6: Thick Rectangle Border (thickness 2)");
draw_rectangle_thick(&mut grid, 70, 30, 30, 20, 2)?;
println!("Demo 7: Thick Rectangle Border (thickness 3)");
draw_rectangle_thick(&mut grid, 110, 30, 35, 25, 3)?;
println!("Demo 8: Thick Rectangle Border (thickness 5)");
draw_rectangle_thick(&mut grid, 10, 55, 40, 30, 5)?;
println!("Demo 9: Triangle Outline (upright orientation)");
let triangle_upright = [(75, 55), (55, 80), (95, 80)];
draw_polygon(&mut grid, &triangle_upright)?;
println!("Demo 10: Triangle Outline (inverted orientation)");
let triangle_inverted = [(75, 85), (55, 60), (95, 60)];
draw_polygon(&mut grid, &triangle_inverted)?;
println!("Demo 11: Square via Polygon (20×20 dots)");
let square = [(105, 55), (125, 55), (125, 75), (105, 75)];
draw_polygon(&mut grid, &square)?;
println!("Demo 12: Pentagon Outline (5 vertices)");
let pentagon = [(135, 55), (145, 65), (140, 80), (130, 80), (125, 65)];
draw_polygon(&mut grid, &pentagon)?;
println!("Demo 13: Hexagon Outline (6 vertices)");
let hexagon = [
(20, 90),
(30, 85),
(40, 90),
(40, 100),
(30, 105),
(20, 100),
];
draw_polygon(&mut grid, &hexagon)?;
println!("Demo 14: Octagon Outline (8 vertices)");
let octagon = [
(65, 88),
(73, 86),
(78, 92),
(78, 100),
(73, 106),
(65, 108),
(57, 106),
(52, 100),
];
draw_polygon(&mut grid, &octagon)?;
println!("Demo 15: Filled Triangle (solid fill)");
let filled_triangle = [(100, 85), (85, 105), (115, 105)];
draw_polygon_filled(&mut grid, &filled_triangle)?;
println!("Demo 16: Filled Hexagon (solid fill)");
let filled_hexagon = [
(135, 85),
(143, 90),
(143, 100),
(135, 105),
(127, 100),
(127, 90),
];
draw_polygon_filled(&mut grid, &filled_hexagon)?;
println!("Demo 17: Irregular Polygon Outline (asymmetric)");
let irregular = [(55, 115), (70, 112), (85, 118), (80, 128), (60, 130)];
draw_polygon(&mut grid, &irregular)?;
println!("Demo 18: Star Polygon (self-intersecting)");
let star = [(110, 115), (115, 130), (105, 120), (120, 120), (110, 135)];
draw_polygon(&mut grid, &star)?;
println!("Demo 19: Rectangle Clipping (partially off-grid, top-left)");
draw_rectangle(&mut grid, -5, -5, 25, 25)?;
println!("Demo 20: Rectangle Clipping (partially off-grid, bottom-right)");
draw_rectangle(&mut grid, 145, 80, 30, 30)?;
println!("Demo 21: Nested Rectangles (concentric pattern)");
for i in 0..5 {
let offset = (i * 3) as i32;
let size = (40 - (i * 6)) as u32;
draw_rectangle(&mut grid, 130 + offset, offset, size, size)?;
}
println!("\n=== Rendered Output ===\n");
let mut renderer = TerminalRenderer::new()?;
renderer.render(&grid)?;
println!("\n=== Demo Complete ===");
println!("Demonstrated:");
println!(" - Rectangle outlines (small, medium, large)");
println!(" - Filled rectangles (solid backgrounds, panels)");
println!(" - Thick rectangle borders (thickness 2, 3, 5)");
println!(" - Triangles (upright, inverted)");
println!(" - Squares (special case of rectangle/polygon)");
println!(" - Regular polygons (pentagon, hexagon, octagon)");
println!(" - Filled polygons (solid triangles, hexagons)");
println!(" - Irregular polygons (asymmetric, complex shapes)");
println!(" - Star patterns (self-intersecting polygons)");
println!(" - Clipping (shapes partially off-grid)");
println!(" - Nested patterns (concentric rectangles)");
Ok(())
}