module img

import gx
import os
import sim

@[params]
pub struct ImageSettings {
pub:
	width      int = sim.default_width
	height     int = sim.default_height
	cache_size int = 200
}

pub fn new_image_settings(settings ImageSettings) ImageSettings {
	return ImageSettings{
		...settings
	}
}

pub fn image_settings_from_grid(grid sim.GridSettings) ImageSettings {
	return ImageSettings{
		width: grid.width
		height: grid.height
	}
}

pub fn (s ImageSettings) to_grid_settings() sim.GridSettings {
	return sim.GridSettings{
		width: s.width
		height: s.height
	}
}

pub struct PPMWriter {
mut:
	file       os.File
	cache      []u8
	cache_size int
}

pub fn ppm_writer_for_fname(fname string, settings ImageSettings) !&PPMWriter {
	mut writer := &PPMWriter{
		cache_size: settings.cache_size
		cache: []u8{cap: settings.cache_size}
	}
	writer.start_for_file(fname, settings)!
	return writer
}

pub fn (mut writer PPMWriter) start_for_file(fname string, settings ImageSettings) ! {
	writer.file = os.create(fname)!
	writer.file.writeln('P6 ${settings.width} ${settings.height} 255')!
}

pub fn (mut writer PPMWriter) handle_pixel(p gx.Color) ! {
	if writer.cache.len >= writer.cache_size {
		writer.write()!
		writer.flush()!
	}
	writer.cache << [p.r, p.g, p.b]
}

pub fn (mut writer PPMWriter) flush() ! {
	writer.cache.clear()
}

pub fn (mut writer PPMWriter) write() ! {
	writer.file.write(writer.cache)!
}

pub fn (mut writer PPMWriter) close() {
	writer.file.close()
}
