/*
 * This software is licensed under the terms of the MIT License.
 * See COPYING for further information.
 * ---
 * Copyright (c) 2011-2019, Lukas Weber <laochailan@web.de>.
 * Copyright (c) 2012-2019, Andrei Alexeyev <akari@taisei-project.org>.
 */

#include "taisei.h"

#include "version.h"

int taisei_version_compare(TaiseiVersion *v1, TaiseiVersion *v2, TaiseiVersionCmpLevel level) {
	int result = 0;

	if((result = (int)v1->major - (int)v2->major) && level >= VCMP_MAJOR) return result;
	if((result = (int)v1->minor - (int)v2->minor) && level >= VCMP_MINOR) return result;
	if((result = (int)v1->patch - (int)v2->patch) && level >= VCMP_PATCH) return result;
	if((result = (int)v1->tweak - (int)v2->tweak) && level >= VCMP_TWEAK) return result;

	return result;
}

size_t taisei_version_read(SDL_RWops *rwops, TaiseiVersion *version) {
	// XXX: detect errors somehow?

	version->major = SDL_ReadU8(rwops);
	version->minor = SDL_ReadU8(rwops);
	version->patch = SDL_ReadU8(rwops);
	version->tweak = SDL_ReadLE16(rwops);

	return TAISEI_VERSION_SIZE;
}

size_t taisei_version_write(SDL_RWops *rwops, TaiseiVersion *version) {
	size_t wrote_now = 0, wrote_total = 0;

	if(!(wrote_now = SDL_WriteU8(rwops, version->major))) {
		return wrote_total;
	} else {
		wrote_total += wrote_now;
	}

	if(!(wrote_now = SDL_WriteU8(rwops, version->minor))) {
		return wrote_total;
	} else {
		wrote_total += wrote_now;
	}

	if(!(wrote_now = SDL_WriteU8(rwops, version->patch))) {
		return wrote_total;
	} else {
		wrote_total += wrote_now;
	}

	if(!(wrote_now = 2 * SDL_WriteLE16(rwops, version->tweak))) {
		return wrote_total;
	} else {
		wrote_total += wrote_now;
	}

	assert(wrote_total == TAISEI_VERSION_SIZE);
	return wrote_total;
}

char *taisei_version_tostring(TaiseiVersion *version) {
	StringBuffer sbuf = {};
	taisei_version_tostrbuf(&sbuf, version);
	return sbuf.start;
}

void taisei_version_tostrbuf(StringBuffer *sbuf, TaiseiVersion *version) {
	strbuf_printf(sbuf, "%u.%u", version->major, version->minor);

	if(!version->patch && !version->tweak) {
		return;
	}

	strbuf_printf(sbuf, ".%u", version->patch);

	if(!version->tweak) {
		return;
	}

	strbuf_printf(sbuf, ".%u", version->tweak);
}
