#include "internal.h"
#include <iostream>
#include <fstream>
#include <regex>

using namespace std;

bool starts_with(const std::string &s, const std::string &prefix)
{
	return s.rfind(prefix, 0) == 0;
}

int main(int argc, char **argv)
{
	EventState state;
	int l = 0;
	bool err = false;

	if (argc != 2) {
		std::cerr << "Please specify event file" << std::endl;
		return -1;
	}

	std::fstream stream(argv[1]);
	std::string line;

	while (std::getline(stream, line)) {
		l++;

		if (line == "")
			continue;

		if (starts_with(line, "#"))
			continue;

		if (starts_with(line, "---"))
			break;

		state.set_from_line(line);
	}

	std::regex expect_regex(
		"^[^\\s]+\\s+\\(([^\\)]+)\\):\\s+(\\d+)\\s+\\((\\d+),\\s+(\\d+),\\s+#(.{2})(.{2})(.{2})\\)\\s+by\\s+([^\\s]+)\\s.*$");

	while (std::getline(stream, line)) {
		l++;

		if (line == "")
			continue;

		if (starts_with(line, "#"))
			continue;

		std::smatch sm;

		if (!std::regex_match(line, sm, expect_regex)) {
			std::cout << "ignore " << line << endl;
		}

		LED led(sm[1]);

		auto s = led.evaluate(state);

		LEDState expected;
		expected.code.type = std::stoi(sm[2]);
		expected.code.params[0] = std::stoi(sm[3]);
		expected.code.params[1] = std::stoi(sm[4]);
		expected.code.color.c[0] = std::stoi(sm[5], 0, 16);
		expected.code.color.c[1] = std::stoi(sm[6], 0, 16);
		expected.code.color.c[2] = std::stoi(sm[7], 0, 16);
		expected.overlay_name = sm[8];

		if (s != expected) {
			std::cerr << argv[1] << ":" << l << " failed"
				  << std::endl;
			std::cerr << "Got: " << s.str() << std::endl;
			std::cerr << "Expected: " << expected.str()
				  << std::endl;
			err = true;
		}
	}

	return err ? -1 : 0;
}