#include "wj_qr.h"
#include "qrcodegen.h"

WJQRImage WJ_MakeQRCode(const std::string &text, int moduleScale)
{
	WJQRImage result;

	uint8_t tempBuffer[qrcodegen_BUFFER_LEN_MAX];
	uint8_t qrcode[qrcodegen_BUFFER_LEN_MAX];

	bool ok = qrcodegen_encodeText(text.c_str(), tempBuffer, qrcode,
		qrcodegen_Ecc_MEDIUM, qrcodegen_VERSION_MIN, qrcodegen_VERSION_MAX,
		qrcodegen_Mask_AUTO, true);
	if (!ok)
		return result;

	if (moduleScale < 1)
		moduleScale = 1;

	const int quietZoneModules = 4;
	const int size = qrcodegen_getSize(qrcode);
	const int totalModules = size + quietZoneModules * 2;
	const int width = totalModules * moduleScale;

	result.width = width;
	result.rgba.resize(size_t(width) * width * 4, 0xFF);

	for (int y = 0; y < width; y++)
	{
		int moduleY = y / moduleScale - quietZoneModules;
		for (int x = 0; x < width; x++)
		{
			int moduleX = x / moduleScale - quietZoneModules;
			bool dark = false;
			if (moduleX >= 0 && moduleX < size && moduleY >= 0 && moduleY < size)
				dark = qrcodegen_getModule(qrcode, moduleX, moduleY);

			uint8_t v = dark ? 0x00 : 0xFF;
			uint8_t *px = &result.rgba[(size_t(y) * width + x) * 4];
			px[0] = v;
			px[1] = v;
			px[2] = v;
			px[3] = 0xFF;
		}
	}

	return result;
}
