// simulator-fltk.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-fltk.exe simulator-fltk.cpp avtomat.cpp -lfltk

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Text_Display.H>
#include <FL/Fl_Menu_Bar.H>
#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include "avtomat.h"

using namespace std;

class Simulator : public Fl_Window {
  private:
  Fl_Text_Buffer bOkno1;
  Fl_Text_Display okno1;
  Fl_Menu_Bar glavniMenu;
  static void cbMenuAvtomatStanje(Fl_Widget* w, void* data);
  static void cbMenuAvtomatExit(Fl_Widget* w, void* data);
  static void cbMenuAvtomatVstavi1(Fl_Widget* w, void* data);
  static void cbMenuAvtomatVstavi2(Fl_Widget* w, void* data);
  static void cbMenuAvtomatVstavi5(Fl_Widget* w, void* data);
  static void cbMenuAvtomatIzberiKava(Fl_Widget* w, void* data);
  static void cbMenuAvtomatIzberiKakav(Fl_Widget* w, void* data);

  private:
  Avtomat avtomat;
  void prikazi(string vrstica);
  void newline();
  
  public:
  Simulator(int x, int y);
};

Simulator::Simulator(int x, int y):
  Fl_Window(x,y,"Simulator"),
  okno1(0,30,w(),h()-30),
  glavniMenu(0,0,w(),30),
  avtomat()
{
  okno1.buffer(bOkno1);
  resizable(okno1);
  glavniMenu.add("Avtomat/Stanje",0,cbMenuAvtomatStanje);
  glavniMenu.add("Avtomat/Exit",0,cbMenuAvtomatExit);
  glavniMenu.add("Vstavi/1 cent",0,cbMenuAvtomatVstavi1);
  glavniMenu.add("Vstavi/2 centa",0,cbMenuAvtomatVstavi2);
  glavniMenu.add("Vstavi/5 centov",0,cbMenuAvtomatVstavi5);
  glavniMenu.add("Izberi/Kava",0,cbMenuAvtomatIzberiKava);
  glavniMenu.add("Izberi/Kakav",0,cbMenuAvtomatIzberiKakav);
}

void Simulator::prikazi(string vrstica)
{
  bOkno1.append(vrstica.c_str()); //show one line of text
}

void Simulator::newline()
{
  bOkno1.append("\n");
}

void Simulator::cbMenuAvtomatExit(Fl_Widget* w, void* data)
{
  exit(0); //exit immediately
}
void Simulator::cbMenuAvtomatStanje(Fl_Widget* w, void* data)
{
  Simulator* simulator = ((Simulator*) w->parent());
  simulator->prikazi("Prikaz stanja.");
  simulator->newline();
  stringstream x;
  x << "Denar: " << simulator->avtomat.getStanje() << endl <<
       "Prodano kava: " << simulator->avtomat.getStatistikaKava() << endl <<
       "Prodano kakav: " << simulator->avtomat.getStatistikaKakav();
  simulator->prikazi(x.str());
  simulator->newline();
}

void Simulator::cbMenuAvtomatVstavi1(Fl_Widget* w, void* data)
{
  Simulator* simulator = ((Simulator*) w->parent());
  int novoStanje = simulator->avtomat.sprejmiKovanec(1);
  simulator->prikazi("Vstavil si 1 cent.");
  simulator->newline();
  stringstream x;
  x << "Kredit: " << novoStanje;
  simulator->prikazi(x.str());
  simulator->newline();
}

void Simulator::cbMenuAvtomatVstavi2(Fl_Widget* w, void* data)
{
  Simulator* simulator = ((Simulator*) w->parent());
  int novoStanje = simulator->avtomat.sprejmiKovanec(2);
  simulator->prikazi("Vstavil si 2 centa.");
  simulator->newline();
  stringstream x;
  x << "Kredit: " << novoStanje;
  simulator->prikazi(x.str());
  simulator->newline();
}

void Simulator::cbMenuAvtomatVstavi5(Fl_Widget* w, void* data)
{
  Simulator* simulator = ((Simulator*) w->parent());
  int novoStanje = simulator->avtomat.sprejmiKovanec(5);
  simulator->prikazi("Vstavil si 5 centov.");
  simulator->newline();
  stringstream x;
  x << "Kredit: " << novoStanje;
  simulator->prikazi(x.str());
  simulator->newline();
}

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

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

int main()
{
  Simulator simulator(800,400); //window size
  simulator.show();
  return Fl::run();
}
