/**********************************************************************
 *
 *   FreeDoko a Doppelkopf-Game
 *    
 *   Copyright (C) 2001-2004  by Diether Knof and Borg Enders
 *
 *   This program is free software; you can redistribute it and/or 
 *   modify it under the terms of the GNU General Public License as 
 *   published by the Free Software Foundation; either version 2 of 
 *   the License, or (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details. 
 *   You can find this license in the file 'gpl.txt'.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
 *   MA  02111-1307  USA
 *
 *  Contact:
 *    Diether Knof dknof@gmx.de
 *    Borg Enders  borg@borgsoft.de
 *
 **********************************************************************/

#ifndef CLASS_OS_HEADER
#define CLASS_OS_HEADER

#include "../card/card.h"
#include "../misc/translator.h"

class Trick;
class Player;
class Hand;

namespace OS_TYPE {
  enum OSType {
    NONE,
    GAMEPLAY,
    PARTY_POINTS,
    SEED,
    OS_BUG_REPORT,
    OS_BUG_REPORT_REPLAY,
    SOUND
  };
} // namespace OS_TYPE

/**
 **
 ** the base os (output system) class
 **
 ** @author	Diether Knof
 **
 **/
class OS {
  friend OS* new_OS(OS_TYPE::OSType const type);

  public:
  OS(OS_TYPE::OSType const type);

  virtual ~OS();

  OS_TYPE::OSType type() const;

  // initialize the ui
  virtual void init(int& argc, char**& argv);

  // updates the OS
  static void update();
  // sleeps 'sleep_usec' thousands of seconds
  // (< 0 for infinity)
  virtual void sleep(unsigned const sleep_usec);
  // updates the language
  virtual void language_update();

  // the parts of a party
  virtual void party_open();
  virtual void party_get_settings();
  virtual void party_start();
  virtual void party_finish();
  virtual void party_close();

  // the parts of a game
  virtual void game_open();
  virtual void reservation_get(Player const& player);
  virtual void game_start();
  virtual void game_finish();
  virtual void game_close();

  // the parts of a trick
  virtual void trick_open();
  virtual void trick_full(Trick const& trick);
  virtual void trick_move_in_pile(Trick const& trick);
  virtual void trick_close();
  // get a card
  virtual void card_get(Player const& player);
  // the card is played
  virtual void card_played(Card const& card, Player const& player);
  // an announcement is made
  virtual void announcement_made(Announcement const& announcement,
				 Player const& player);
  // the player has swines
  virtual void swines_announced(Player const& player);
  // the player has hyperswines
  virtual void hyperswines_announced(Player const& player);

  // 'player' shifts 'cardno' cards
  virtual void poverty_shift(Player const& player,
			     unsigned const cardno);
  // ask 'player' whether to accept the poverty
  virtual void poverty_ask(Player const& player,
			   unsigned const cardno);
  // the player 'player' has denied the poverty trumps
  virtual void poverty_take_denied(Player const& player);
  // all players have denied to take the cards
  virtual void poverty_take_denied_by_all();
  // the player 'player' has accepted the poverty trumps
  // and has returned 'cardno' cards with 'trumpno' trumps
  virtual void poverty_take_accepted(Player const& player,
				     unsigned const cardno,
				     unsigned const trumpno);
  // 'player' shifts cards
  virtual void poverty_shift(Player const& player);
  // returns whether 'player' accepts the poverty
  virtual void poverty_take_accept(Player const& player,
				   unsigned const cardno);
  // the player changes the cards of the poverty
  virtual void poverty_cards_change(Player const& player,
				    Hand const& cards);
  // the poverty player 'player' gets 'cards'
  virtual void poverty_cards_get_back(Player const& player,
				      Hand const& cards);

  // the marriage partner has found a bride
  virtual void marriage(Player const& bridegroom, Player const& bride);
  // return a partner for a genscher
  virtual void genscher_partner();
  // a player has announced a genscher
  virtual void genscher(Player const& genscher, Player const& partner);


  // redrawing
  virtual void redraw_all();
  virtual void gametype_update();
  virtual void player_update(Player const& player);
  virtual void name_update(Player const& player);
  virtual void hand_update(Player const& player);
  virtual void teaminfo_update(Player const& player);

  // change of the rules
  virtual void rule_update(int const type, void const* const old_value);
  // changes of the settings
  virtual void setting_update(int const type, void const* const old_value);
  // load the help page
  virtual void help_load(string const& page);

  // for status messages
  Translator::Translation status_message() const;
  void add_status_message(Translator::Translation const& status_message);
  void remove_status_message(Translator::Translation const& status_message);
  virtual void status_message_changed(Translator::Translation const& status_message);

  // for progress
  double progress() const;
  void set_max_progress(double const progress_max);
  void add_progress(double const progress);
  void finish_progress();
  virtual void progress_changed(double const progress_max);
  virtual void progress_finished();

  // information for the user
  virtual void information(Translator::Translation const& message);
  // an error has occured
  virtual void error(string const& message);

  protected:
  OS_TYPE::OSType type_p;

  private:
  vector<Translator::Translation> status_message_;
  double progress_;
  double progress_max_;

  private: // not to be used
  OS();
  OS(OS const&);
  OS& operator=(OS const&);
}; // class OS

OS* new_OS(const OS_TYPE::OSType type_a);

#endif // #ifndef CLASS_OS_HEADER
