#ifndef OUTPUTPROCESSOR_H_
#define OUTPUTPROCESSOR_H_

// Author: Steve Talbot

#pragma once

using namespace std;

#include "Data.h"

#include "prompt_for_pin_a.h"
#include "prompt_for_pin_1.h"
#include "incorrect_id_msg_a.h"
#include "incorrect_id_msg_1.h"
#include "incorrect_pin_msg_a.h"
#include "incorrect_pin_msg_1.h"
#include "too_many_attempts_msg_a.h"
#include "too_many_attempts_msg_1.h"
#include "display_menu_a.h"
#include "display_menu_1.h"
#include "deactivate_msg_a.h"
#include "deactivate_msg_1.h"
#include "make_withdraw_a.h"
#include "make_withdraw_1.h"
#include "penalty_a.h"
#include "penalty_1.h"
#include "make_deposit_a.h"
#include "make_deposit_1.h"
#include "display_balance_a.h"
#include "display_balance_1.h"
#include "below_min_balance_msg_a.h"
#include "below_min_balance_msg_1.h"
#include "activate_msg_a.h"
#include "activate_msg_1.h"
#include "inactive_account_msg_a.h"
#include "inactive_account_msg_1.h"



class OutputProcessor {

public:
	OutputProcessor( Data* data_ );
	~OutputProcessor();

	void removeCurrentConfiguration();

	bool prompt_for_pin();
	bool incorrect_id_msg();
	bool incorrect_pin_msg();
	bool too_many_attempts_msg();

	bool display_menu();

	bool deactivate_msg();

	bool make_withdraw();
	bool penalty();
	bool make_deposit();
	bool display_balance();

	bool below_min_balance_msg();

	bool activate_msg();

	bool inactive_account_msg();

	// setters ..
	void setPromptForPinA( prompt_for_pin_a* PFP_ );
	void setIncorrectIdMsgA( incorrect_id_msg_a* IIM_ );
	void setIncorrectPinMsgA( incorrect_pin_msg_a* IPM_ );
	void setTooManyAttemptsMsgA( too_many_attempts_msg_a* TMAM_ );
	void setDisplayMenuA( display_menu_a* DM_ );
	void setDeactivateMsgA( deactivate_msg_a* DAM_ );
	void setMakeWithdrawMsgA( make_withdraw_a* MW_ );
	void setPenaltyA( penalty_a* PE_ );
	void setMakeDepositA( make_deposit_a* MD_ );
	void setDisplayBalanceA( display_balance_a* DB_ );
	void setBelowMinBalanceMsgA( below_min_balance_msg_a* BMBM_ );
	void setActivateMsgA( activate_msg_a* AM_ );
	void setInactiveAccountMsgA( inactive_account_msg_a* IAM_ );

	// getters ..
	prompt_for_pin_a* getPromptForPinA();
	incorrect_id_msg_a* getIncorrectIdMsgA();
	incorrect_pin_msg_a* getIncorrectPinMsgA();
	too_many_attempts_msg_a* getTooManyAttemptsMsgA();
	display_menu_a* getDisplayMenuA();
	deactivate_msg_a* getDeactivateMsgA();
	make_withdraw_a* getMakeWithdawA();
	penalty_a* getPenaltyA();
	make_deposit_a* getMakeDepositA();
	display_balance_a* getDisplayBalanceA();
	below_min_balance_msg_a* getBelowMinBalanceMsgA();
	activate_msg_a* getActivateMsgA();
	inactive_account_msg_a* getInactiveAccountMsgA();

	// utility methods ..
	void resetNumberOfAttempts();

private:

	Data* _data;

	prompt_for_pin_a* _PFP;

	incorrect_id_msg_a* _IIM;

	incorrect_pin_msg_a* _IPM;

	too_many_attempts_msg_a* _TMAM;

	display_menu_a* _DM;

	deactivate_msg_a* _DAM;

	make_withdraw_a* _MW;

	penalty_a* _PE;

	make_deposit_a* _MD;

	display_balance_a* _DB;

	below_min_balance_msg_a* _BMBM;

	activate_msg_a* _AM;

	inactive_account_msg_a* _IAM;


};

#endif /*OUTPUTPROCESSOR_H_*/
