#include <string>
#include <vector>
#include <iostream>
#include <stdlib.h>
#include <signal.h>
#include <curses.h>

static void finish(int sig) 
{
  endwin();
  exit(0);
}

class Menu
{
private:
  std::string title;
  typedef std::vector<std::string> Items;
  Items items;
  int current_item;

public:
  Menu(const std::string& title_) 
    :title(title_), current_item(0) {}
  ~Menu() {}
  
  void add(const std::string& str) {
    items.push_back(str);
  }

  void draw() {
    clear();

    attron(A_BOLD | COLOR_PAIR(COLOR_GREEN));
    mvprintw(0, 0, title.c_str());
    attroff(A_BOLD | COLOR_PAIR(COLOR_GREEN));
    
    for(int i = 0; i < int(items.size()); ++i)
      {
        if (i == current_item)
          {
            attron(A_BOLD | COLOR_PAIR(COLOR_RED));
            mvprintw(2 + i, 0, ("* " + items[i]).c_str());
            attroff(A_BOLD | COLOR_PAIR(COLOR_RED));
          }
        else
          {
            mvprintw(2 + i, 0, ("  " + items[i]).c_str());
          }
      }
  }

  int display() 
  {
    while(true)
      {
        draw();

        curs_set(0);

        int c = getch();
        switch (c)
          {
          case KEY_DOWN:
            if (current_item == int(items.size())-1)
              current_item = 0;
            else
              current_item += 1;
            break;
            
          case KEY_UP:
            if (current_item == 0)
              current_item = items.size() - 1;
            else
              current_item -= 1;
            break;

          case '\r':
            return current_item;
        }
      }
  }
  
};

int main(int argc, char** argv)
{
  /* arrange interrupts to terminate */
  signal(SIGINT, finish);
  
  initscr();      /* initialize the curses library */
  keypad(stdscr, TRUE);  /* enable keyboard mapping */
  nonl();         /* tell curses not to do NL->CR/NL on output */
  cbreak();       /* take input chars one at a time, no wait for \n */
  noecho();       /* don't echo input */

  if (has_colors())
    {
      start_color();

      /*
       * Simple color assignment, often all we need.
       */
      init_pair(COLOR_BLACK,   COLOR_BLACK,   COLOR_BLACK);
      init_pair(COLOR_GREEN,   COLOR_GREEN,   COLOR_BLACK);
      init_pair(COLOR_RED,     COLOR_BLACK,   COLOR_WHITE);
      init_pair(COLOR_CYAN,    COLOR_CYAN,    COLOR_BLACK);
      init_pair(COLOR_WHITE,   COLOR_WHITE,   COLOR_BLACK);
      init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
      init_pair(COLOR_BLUE,    COLOR_BLUE,    COLOR_BLACK);
      init_pair(COLOR_YELLOW,  COLOR_YELLOW,  COLOR_BLACK);
    }

 start:
  Menu menu("Hot Dog Tycoon");
  menu.add("Start new Game");
  menu.add("Buy new resources");
  menu.add("Eat some foot");
  menu.add("Quit");
  switch(menu.display())
    {
    case 3: // quit
      break;
    default:
      goto start;
    }

  endwin();
}

/* EOF */
