// simulator.cpp - copyright Robert Meolic 2017/2018
// komentarji so v anglescini, da je program uporaben tudi za studente ERASMUS programa

// build with: g++ -Wall -o simulator.exe simulator.cpp avtomat.cpp

#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include "avtomat.h"

using namespace std;

class Simulator
{
  private:
  char izbira();
  void glavniMenu();
  void menuAvtomat();
  void menuVstavi();
  void menuIzberi();
  void cbMenuAvtomatStanje();
  void cbMenuAvtomatExit();
  void cbMenuAvtomatVstavi1();
  void cbMenuAvtomatVstavi2();
  void cbMenuAvtomatVstavi5();
  void cbMenuAvtomatIzberiKava();
  void cbMenuAvtomatIzberiKakav();

  private:
  Avtomat avtomat;
  void prikazi(string vrstica);
  void newline();
  
  public:
  Simulator(); //default constructor
  void run();
};

Simulator::Simulator(): avtomat()
{
}

char Simulator::izbira()
{
  char znak;
  cin >> znak; //read character
  while(cin.get()!='\n'); //clear extra characters in input line
  return toupper(znak); //return uppercase letter
}

void Simulator::glavniMenu()
{
  cout << "[A] Avtomat" << endl;
  cout << "[V] Vstavi" << endl;
  cout << "[I] Izberi" << endl;
  
  bool done = false;
  do {
    cout << "Izbira: ";
    char znak = izbira();
    switch(znak) {
      case 'A': menuAvtomat(); done = true; break;
      case 'V': menuVstavi(); done = true; break;
      case 'I': menuIzberi(); done = true; break;
      default: cout << "Neveljavni vnos! Vnesi A, V ali I." << endl;
    }
  } while (!done);
}

void Simulator::menuAvtomat()
{
  cout << "[S] Stanje" << endl;
  cout << "[E] Exit" << endl;

  bool done = false;
  do {
    cout << "Izbira: ";
    char znak = izbira();
    switch(znak) {
      case 'S': cbMenuAvtomatStanje(); done = true; break;
      case 'E': cbMenuAvtomatExit(); done = true; break;
      default: cout << "Neveljavni vnos! Vnesi S ali E." << endl;
    }
  } while (!done);
}

void Simulator::menuVstavi()
{
  cout << "[1] Vstavi 1 cent" << endl;
  cout << "[2] Vstavi 2 centa" << endl;
  cout << "[5] Vstavi 5 centov" << endl;

  bool done = false;
  do {
    cout << "Izbira: ";
    char znak = izbira();
    switch(znak) {
      case '1': cbMenuAvtomatVstavi1(); done = true; break;
      case '2': cbMenuAvtomatVstavi2(); done = true; break;
      case '5': cbMenuAvtomatVstavi5(); done = true; break;
      default: cout << "Neveljavni vnos! Vnesi 1, 2 ali 5." << endl;
    }
  } while (!done);
}

void Simulator::menuIzberi()
{
  cout << "[C] Izberi kava" << endl;
  cout << "[K] Izberi kakav" << endl;

  bool done = false;
  do {
    cout << "Izbira: ";
    char znak = izbira();
    switch(znak) {
      case 'C': cbMenuAvtomatIzberiKava(); done = true; break;
      case 'K': cbMenuAvtomatIzberiKakav(); done = true; break;
      default: cout << "Neveljavni vnos! Vnesi C ali K." << endl;
    }
  } while (!done);
}

void Simulator::prikazi(string vrstica)
{
  cout << vrstica; //show one line of text
}

void Simulator::newline()
{
  cout << endl;
}

void Simulator::run() {
  glavniMenu();
}

void Simulator::cbMenuAvtomatExit()
{
  exit(0); //exit immediately
}

void Simulator::cbMenuAvtomatStanje()
{
  prikazi("Prikaz stanja.");
  newline();
  stringstream x;
  x << "Denar: " << avtomat.getStanje() << endl <<
       "Prodano kava: " << avtomat.getStatistikaKava() << endl <<
       "Prodano kakav: " << avtomat.getStatistikaKakav();
  prikazi(x.str());
  newline();
}

void Simulator::cbMenuAvtomatVstavi1()
{
  int novoStanje = avtomat.sprejmiKovanec(1);
  prikazi("Vstavil si 1 cent.");
  newline();
  stringstream x;
  x << "Kredit: " << novoStanje;
  prikazi(x.str());
  newline();
}

void Simulator::cbMenuAvtomatVstavi2()
{
  int novoStanje = avtomat.sprejmiKovanec(2);
  prikazi("Vstavil si 2 centa.");
  newline();
  stringstream x;
  x << "Kredit: " << novoStanje;
  prikazi(x.str());
  newline();
}

void Simulator::cbMenuAvtomatVstavi5()
{
  int novoStanje = avtomat.sprejmiKovanec(5);
  prikazi("Vstavil si 5 centov.");
  newline();
  stringstream x;
  x << "Kredit: " << novoStanje;
  prikazi(x.str());
  newline();
}

void Simulator::cbMenuAvtomatIzberiKava()
{
  int novoStanje = avtomat.prodajKava();
  prikazi("Izbral si kavo.");
  newline();
  if (novoStanje < 0) {
    prikazi("Ne morem izdati. Vstavi vec denarja.");
    newline();
  } else {
    prikazi("Izvoli! Dobil si kavo.");
    newline();
    stringstream x;
    x << "Kredit: " << novoStanje;
    prikazi(x.str());
    newline();
  }
}

void Simulator::cbMenuAvtomatIzberiKakav()
{
  int novoStanje = avtomat.prodajKakav();
  prikazi("Izbral si kakav.");
  newline();
  if (novoStanje < 0) {
    prikazi("Ne morem izdati. Vstavi vec denarja.");
    newline();
  } else {
    prikazi("Izvoli! Dobil si kakav.");
    newline();
    stringstream x;
    x << "Kredit: " << novoStanje;
    prikazi(x.str());
    newline();
  }
}

int main()
{
  Simulator simulator;
  while (1) simulator.run(); //run forever
}
