#ifndef _MXSDLMSG_H__
#define _MXSDLMSG_H__
#ifdef _WIN32
#include<windows.h>
#endif
#include<string>
#include<sstream>

class ErrorMsg {
public:
	ErrorMsg(std::string err) {

		str_val = err;
	}

	void PrintLastError() {
		std::ostringstream ss;

		ss << "Unhandled Exception: " <<  str_val << "\n";
#ifdef _WIN32
		MessageBox(GetForegroundWindow(),ss.str().c_str(),"Unhandled Exception", MB_OK | MB_ICONERROR);

#else
		std::cout << ss.str();
#endif
	}
protected:

	std::string str_val;
};

class Message {
public:
	Message() {

		str = "";
		caption = "";
	}
	Message(std::string str, std::string caption) {

		this->str = str, this->caption = caption;
	}

	void SendMessage() {
#ifdef _WIN32
		MessageBox(GetForegroundWindow(), str.c_str(), caption.c_str(), MB_ICONINFORMATION);

#else
		std::cout << caption << " : " << str << "\n";

#endif
	}
	void DebugMessage() {
		std::ostringstream ss;
		ss << caption << " : " << str << "\n";

#ifdef _WIN32
		OutputDebugString(ss.str().c_str());
#else
		std::cout << ss.str();

#endif
	}
	Message &operator<<(std::string s) {
		std::ostringstream ss;

		ss << str << s;
		str = ss.str();

		return *this;
	}

	Message &operator<<(int x) {

		std::ostringstream ss;
		ss << str << x;
		str = ss.str();

		return *this;
	}

	Message &operator<<(float x) {

		std::ostringstream ss;
		ss << str << x;
		str = ss.str();

		return *this;
	}
	Message &operator=(std::string s) {

		caption = s;
		return *this;
	}
	Message &operator+=(std::string s) {

		caption += s;
		return *this;
	}
	void clear() {

		str = "";
	}
	void flush() {
		str = "";

		caption = "";
	}
protected:
	std::string str,caption;
};

#endif