#include "Main.h"
#include "OutputDevice.h"

class SumStatus
{
private:
	int a, b, c;
public:
	SumStatus(int a, int b, int c) : a(a), b(b), c(c) {}

	enum Result
	{
		Success,
		Failure,
	};

	Result getResult()
	{
		if (a + b == c)
		{
			return Success;
		}
		else
		{
			return Failure;
		}
	}
};


class MainImpl
{
public:
	enum Message
	{
		MathSuccess,
		MathFailure,
	};

	void printMessage(OutputDevice* od, Message message)
	{
		switch(message)
		{
		case MathSuccess:
			od->output("Mathematics appears to be in order.");
			break;
		case MathFailure:
			od->output("Oh dear, mathematics is falling apart.");
			break;
		}
	}

	int run(int argc, char *argv[])
	{
		SumStatus MathStatus(1, 1, 2);
		OutputDevice* od = new ConsoleOutputDevice;

		switch (MathStatus.getResult())
		{
			case SumStatus::Success:
				printMessage(od, MathSuccess);
				break;
			case SumStatus::Failure:
				printMessage(od, MathFailure);
				break;
		}

		delete od;
	}
};

Main::Main()
{
	impl = new MainImpl;
}

Main::~Main()
{
	delete impl;
}

int Main::run(int argc, char *argv[])
{
	return impl->run(argc, argv);
}
