use std::{fs::File, io::{BufWriter, Write}};

use crate::font::{GlyphHeader, GlyphPoint};

use super::Visitor;

pub struct SvgWriter {
	first_point: bool,
	writer: BufWriter<File>
}

impl SvgWriter {
	pub fn new(file: File) -> Self {
		SvgWriter {
			first_point: true,
			writer: BufWriter::new(file)
		}
	}
}

impl Visitor for SvgWriter {
	fn write_prefix(&mut self, header: &GlyphHeader) {
		write!(
			self.writer,
			"<svg width=\"1000\" height=\"1000\" viewBox=\"{} {} {} {}\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"",
			header.xmin, header.ymin,
			header.xmax - header.xmin,
			header.ymax - header.ymin
		);
	}

	fn write_point(&mut self, point: &GlyphPoint) {
		if !point.on_curve {
			return
		}

		let prefix = if self.first_point { "M" } else { "L" };

		write!(
			self.writer,
			"{prefix}{} {} ",
			point.x, point.y
		);

		self.first_point = false;
	}

	fn write_suffix(&mut self) {
		write!(
			self.writer,
			"\" style=\"fill:none; stroke:black; stroke-width:3;\" /></svg>"
		);
	}
}