#ifndef __USERINTERACTION_H__
#define __USERINTERACTION_H_
#include <iostream>
#include "utilities.h"
using namespace std;
const long MENU_MIN = 1;
const long MENU_FACT = MENU_MIN;
const long MENU_EXP = MENU_MIN + 1;
const long MENU_SIN = MENU_MIN + 2;
const long MENU_ROOT = MENU_MIN + 3;
const long MENU_COSH = MENU_MIN + 4;
const long MENU_QUIT = MENU_MIN + 5;
const long MENU_MAX = MENU_QUIT;
const long MENU_SNARK = MENU_MAX + 1;
// Desc: Outputs the menu for the snark calculator and receives
// the menu selection
// Pre: None
// Post: Outputs the snark calculator menu to the console and
// receives menu selections until the user chooses an appropriate
// option
long PresentMenu();
// Desc: Outputs the menu for the snark calculator
// Pre: None
// Post: The snark calculator menu will be outputted to the console
void OutputMenu();
// Desc: Outputs a random snarky message to the console
// Pre: None
// Post: A random snark message will be selected and outputted
// to the console
void RandomMenuSnark();
// Desc: Formats and outputs the answer to the specifed calculation
// Pre: The type parameter must be one of the menu choices and the
// T1 and T2 types must be able to be outputted to the console
// Post: Based on the type parameter, the input and answer parameters
// will be formatted and outputted to the console
template <typename T1, typename T2>
void OutputAnswer(const long type, const T1 input, const T2 answer);
// Desc: Requests input from the user within the given bounds
// Pre: The types T1 and T2 must be able to be compared and min
// must be less than max and the type T1 must be able to be read
// in from the console
// Post: The message will be printed to the console and input will
// be read until the user inputs a value that is between the min
// and max parameters, inclusive
template <typename T1, typename T2>
void RequestInput(const string message, T1& input, const T2 min, const T2 max);
// Desc: Requests input from the user that is at least the given value
// Pre: The types T1 and T2 must be able to be compared and the type
// T1 must be able to be read in from the console
// Post: The message will be printed to the console and input will
// be read until the user inputs a value that is at least the min
// value that is passed in
template <typename T1, typename T2>
void RequestInput(const string message, T1& input, const T2 min);
// Desc: Requests input from the user
// Pre: The type T must be able to be read in from the console
// Post: The message will be printed to the console and the input
// parameter will be read in
template <typename T>
void RequestInput(const string message, T& input);
#include "userInteraction.hpp"
#endif