/////////////////////////////////////////////////////////////////////////////
// main function
/////////////////////////////////////////////////////////////////////////////
int main() {
    std::cout << CVersion::GetCopyright();
    CResultSet rs;
    std::vector<std::string> vecName;
    CResultSetCUI rscui(rs, vecName);
    rscui.MainLoop(std::cin, std::cout);

    return 0;
}
////////////////////////////////////////////////////////////////////////////
// Process commands
////////////////////////////////////////////////////////////////////////////
int CPredictionCUI::ProcessCommand(const char *pszCommand,
                                   const char *pszParameters,
                                   std::istream &in,
                                   std::ostream &out)
{
 enum
 {
  IDC_Help,
  IDC_Results,
  IDC_Players,
  IDC_Elo,
  IDC_StdDev,
  IDC_Simulations,
  IDC_Rounds,
  IDC_LossScore,
  IDC_DrawScore,
  IDC_WinScore,
  IDC_Multiplier,
  IDC_Simulate
 };

 switch (ArrayLookup(pszCommand, tszCommands))
 {
  case IDC_Help: ///////////////////////////////////////////////////////////
   CConsoleUI::ProcessCommand(pszCommand, pszParameters, in, out);
   out << "Prediction commands\n";
   out << "~~~~~~~~~~~~~~~~~~~\n";
   out << "results ......... open interface to define players and results\n";
   out << "players ......... list players\n";
   out << "elo n [x] ....... get[set] elo of player number n\n";
   out << "stddev n [x] .... get[set] standard deviation of player number n\n";
   out << '\n';
   out << "simulations [n] . get[set] number of simulations\n";
   out << "rounds [n] ...... get[set] number of (double) rounds\n";
   out << "lossscore [n] ... get[set] score obtained when losing\n";
   out << "drawscore [n] ... get[set] score obtained when drawing\n";
   out << "winscore [n] .... get[set] score obtained when winning\n";
   out << "multiplier [x] .. get[set] score multiplier\n";
   out << '\n';
   out << "simulate [n]..... run simulations (n = rng seed)\n";
  break;

  case IDC_Results: ////////////////////////////////////////////////////////
  {
   //
   // Open a rscui to get a list of players and results
   //
   CResultSetCUI rscui(rs, vecName, this);
   rscui.MainLoop(in, out);

   //
   // Find player ratings and variances in ercui
   //
   velo.resize(vecName.size());
   vStdDev.resize(vecName.size());
   for (unsigned i = 0; i < vecName.size(); i++)
   {
    velo[i] = 0;
    vStdDev[i] = 1000;
    for (int j = ercui.vecName.size(); --j >= 0;)
     if (ercui.vecName[j] == vecName[i])
     {
      velo[i] = ercui.bt.GetElo(j);
      vStdDev[i] = std::sqrt(vbtvariance[j]);
     }
   }
  }
  break;

  case IDC_Players: ////////////////////////////////////////////////////////
  {
   out << std::setw(3) << "Num" << ' ';
   out << std::setw(20) << "Name" << ' ';
   out << std::setw(8) << "Elo" << ' ';
   out << std::setw(8) << "Std.Dev." << '\n';
   for (unsigned i = 0; i < vecName.size(); i++)
   {
    out << std::setw(3) << i << ' ';
    out << std::setw(20) << vecName[i] << ' ';
    out << std::setw(8) << velo[i] << ' ';
    out << std::setw(8) << vStdDev[i] << '\n';
   }
   out << "(" << vecName.size() << " players)\n";
  }
  break;

  case IDC_Elo: ////////////////////////////////////////////////////////////
  {
   std::istringstream is(pszParameters);
   unsigned Player = 0;
   is >> Player;
   if (Player < velo.size())
   {
    is >> velo[Player];
    out << velo[Player] << '\n';
   }
  }
  break;

  case IDC_StdDev: /////////////////////////////////////////////////////////
  {
   std::istringstream is(pszParameters);
   unsigned Player = 0;
   is >> Player;
   if (Player < vStdDev.size())
   {
    is >> vStdDev[Player];
    out << vStdDev[Player] << '\n';
   }
  }