#include <cstdint>
#include <print>
#include "matrix.hpp"
#include "pixel.hpp"

using namespace amt;

int main() {

	auto const format = PixelFormat::abgr;
	PixelBuf b(2, 2, RGBA(0x01, 0x02, 0x03, 0x04));
	b[1][1] = HSLA(280, 20, 50, 80);
	std::println("{:h}", b);


	std::uint8_t ps[4 * 4] = {};
	b.copy_to(ps, format);

	/*for (auto i = 0zu; i < sizeof(ps); ++i) {*/
	/*	std::println("[{}]: 0x{:0x}", i, ps[i]);*/
	/*}*/

	PixelBuf test(ps, 2, 2, format);

	for (auto i = 0zu; auto color: test) {
		std::println("[{}]: {}", i++, color);
	}

	auto m = Matrix<int>{
		{0, 1},
		{3, 4}
	};

	std::println("{}", m);


	
	{
		auto ca = RGBA::from_hex(0x333333ff);
		auto cb = RGBA::from_hex(0xaabbccff);
		std::println("========= RGBA ===========");
		std::println("Normal: 0x{:0x}", ca.blend(cb, BlendMode::normal).to_hex());
		std::println("Multiply: 0x{:0x}", ca.blend(cb, BlendMode::multiply).to_hex());
		std::println("Screen: 0x{:0x}", ca.blend(cb, BlendMode::screen).to_hex());
		std::println("Overlay: 0x{:0x}", ca.blend(cb, BlendMode::overlay).to_hex());
		std::println("darken: 0x{:0x}", ca.blend(cb, BlendMode::darken).to_hex());
		std::println("lighten: 0x{:0x}", ca.blend(cb, BlendMode::lighten).to_hex());
		std::println("Dodge: 0x{:0x}", ca.blend(cb, BlendMode::colorDodge).to_hex());
		std::println("Burn: 0x{:0x}", ca.blend(cb, BlendMode::colorBurn).to_hex());
		std::println("hard light: 0x{:0x}", ca.blend(cb, BlendMode::hardLight).to_hex());
		std::println("soft light: 0x{:0x}", ca.blend(cb, BlendMode::softLight).to_hex());
		std::println("difference: 0x{:0x}", ca.blend(cb, BlendMode::difference).to_hex());
		std::println("exclusion: 0x{:0x}", ca.blend(cb, BlendMode::exclusion).to_hex());
	}

	{
		HSLA ca = RGBA::from_hex(0x333333ff);
		HSLA cb = RGBA::from_hex(0xaabbccff);
		std::println("========= HSLA ===========");
		std::println("Normal: {}", ca.blend(cb, BlendMode::normal));
		std::println("Multiply: {}", ca.blend(cb, BlendMode::multiply));
		std::println("Screen: {}", ca.blend(cb, BlendMode::screen));
		std::println("Overlay: {}", ca.blend(cb, BlendMode::overlay));
		std::println("darken: {}", ca.blend(cb, BlendMode::darken));
		std::println("lighten: {}", ca.blend(cb, BlendMode::lighten));
		std::println("Dodge: {}", ca.blend(cb, BlendMode::colorDodge));
		std::println("Burn: {}", ca.blend(cb, BlendMode::colorBurn));
		std::println("hard light: {}", ca.blend(cb, BlendMode::hardLight));
		std::println("soft light: {}", ca.blend(cb, BlendMode::softLight));
		std::println("difference: {}", ca.blend(cb, BlendMode::difference));
		std::println("exclusion: {}", ca.blend(cb, BlendMode::exclusion));
	}

}
