#ifndef LOADSTATUS_HEADER
#define LOADSTATUS_HEADER

class LoadStatus
{
	bool ready;
	JMutex ready_mutex;
	
	u32 done;
	JMutex done_mutex;

	u32 todo;
	JMutex todo_mutex;

	wchar_t *text;
	JMutex text_mutex;

public:

	LoadStatus(bool a_ready=false, u32 a_done=0, u32 a_todo=0)
	{
		ready = a_ready;
		done = a_done;
		todo = a_todo;
		text = NULL;
		ready_mutex.Init();
		done_mutex.Init();
		todo_mutex.Init();
		text_mutex.Init();
	}

	void setReady(bool a_ready)
	{
		ready_mutex.Lock();
		ready = a_ready;
		ready_mutex.Unlock();
	}

	bool getReady(void)
	{
		ready_mutex.Lock();
		bool a_ready = ready;
		ready_mutex.Unlock();
		return a_ready;
	}

	void setDone(u32 a_done)
	{
		done_mutex.Lock();
		done = a_done;
		done_mutex.Unlock();
	}

	u32 getDone(void)
	{
		done_mutex.Lock();
		u32 a_done = done;
		done_mutex.Unlock();
		return a_done;
	}

	void setTodo(u32 a_todo)
	{
		todo_mutex.Lock();
		todo = a_todo;
		todo_mutex.Unlock();
	}

	u32 getTodo(void)
	{
		todo_mutex.Lock();
		u32 a_todo = todo;
		todo_mutex.Unlock();
		return a_todo;
	}

	/*
		Copies the text if not NULL,
		If NULL; sets text to NULL.
	*/
	void setText(const wchar_t *a_text)
	{
		text_mutex.Lock();
		if(text != NULL)
			free(text);
		if(a_text == NULL){
			text = NULL;
			text_mutex.Unlock();
			return;
		}
		u32 len = wcslen(a_text);
		text = (wchar_t*)malloc(sizeof(wchar_t) * (len+1));
		if(text == NULL) throw;
		swprintf(text, len+1, L"%ls", a_text);
		text_mutex.Unlock();
	}
	
	/*
		Return value must be free'd
		Return value can be NULL
	*/
	wchar_t * getText()
	{
		text_mutex.Lock();
		if(text == NULL){
			text_mutex.Unlock();
			return NULL;
		}
		u32 len = wcslen(text);
		wchar_t *b_text = (wchar_t*)malloc(sizeof(wchar_t) * (len+1));
		if(b_text == NULL) throw;
		swprintf(b_text, len+1, L"%ls", text);
		text_mutex.Unlock();
		return b_text;
	}
	
	/*
		Return value must be free'd
	*/
	wchar_t * getNiceText()
	{
		const wchar_t *defaulttext = L"Loading";
		wchar_t *t = getText();
		u32 maxlen = 20; // " (%i/%i)"
		if(t != NULL)
			maxlen += wcslen(t);
		else
			maxlen += wcslen(defaulttext);
		wchar_t *b_text = (wchar_t*)malloc(sizeof(wchar_t) * (maxlen+1));
		if(b_text == NULL) throw;
		if(t != NULL)
			swprintf(b_text, maxlen+1, L"%ls (%i/%i)",
					t, getDone(), getTodo());
		else
			swprintf(b_text, maxlen+1, L"%ls (%i/%i)",
					defaulttext, getDone(), getTodo());
		if(t != NULL)
			free(t);
		return b_text;
	}
};

#endif