package jrummikub.view;

import java.awt.Color;
import java.io.File;
import java.util.Collection;

import jrummikub.model.Stone;
import jrummikub.model.StoneSet;
import jrummikub.util.IEvent;
import jrummikub.util.IEvent1;

/**
 * The top-level view interface
 */
public interface IView {
	/**
	 * Returns the settings panel
	 * 
	 * @return the settings panel
	 */
	public ISettingsPanel getSettingsPanel();

	/**
	 * Returns the score panel
	 * 
	 * @return the score panel
	 */
	public IScorePanel getScorePanel();

	/**
	 * Returns the table
	 * 
	 * @return the table
	 */
	public ITablePanel getTablePanel();

	/**
	 * Returns the side panel
	 * 
	 * @return the side panel
	 */
	public ISidePanel getSidePanel();

	/**
	 * @return the board where the players hand stones are displayed
	 */
	public IHandPanel getHandPanel();

	/**
	 * Returns the player panel
	 * 
	 * @return the playerPanel
	 */
	public IPlayerPanel getPlayerPanel();

	/**
	 * Sets the current player's name
	 * 
	 * @param playerName
	 *            the player name
	 */
	public void setCurrentPlayerName(String playerName);

	/**
	 * Sets the stones that are to be painted selected
	 * 
	 * @param stones
	 *            the stones to be painted selected
	 */
	public void setSelectedStones(Collection<Stone> stones);

	/**
	 * The start turn event is emitted when the player wants to start his turn
	 * 
	 * @return the event
	 */
	public IEvent getStartTurnEvent();

	/**
	 * The start turn event is emitted when the player knows what invalid stones
	 * he played
	 * 
	 * @return the event
	 */
	IEvent getAcknowledgeInvalidEvent();

	/**
	 * The quit event is emitted when the player wants to quit the game
	 * 
	 * @return the event
	 */
	public IEvent getEndProgramEvent();

	/**
	 * The new round event is emitted when the player wants to start a new round
	 * 
	 * @return the event
	 */
	public IEvent getNewRoundEvent();

	/**
	 * Shows or hides the game settings panel
	 * 
	 * @param show
	 *            specifies if the panel shall be shown or hidden
	 */
	public void showSettingsPanel(boolean show);

	/**
	 * Shows or hides the score panel
	 * 
	 * @param show
	 *            specifies if the panel shall be shown or hidden
	 */
	public void showScorePanel(boolean show);

	/**
	 * Is used for the PlayerPanel and ScorePanel to display a player's color
	 * along with the name
	 * 
	 * @param color
	 *            the current player's color
	 */
	public void setCurrentPlayerColor(Color color);

	/**
	 * Is used for the PlayerPanel to display if a player has laid out along
	 * with the name
	 * 
	 * @param hasLaidOut
	 *            specifies if the current player has laid out or not
	 */
	public void setCurrentPlayerHasLaidOut(boolean hasLaidOut);

	/**
	 * Is emitted if the player wants to end the game and start a new one
	 * 
	 * @return newGameEvent
	 */
	public IEvent getNewGameEvent();

	/**
	 * Sets the bottom panels type
	 * 
	 * @param type
	 *            the type of the bottom panel
	 */
	public void setBottomPanel(BottomPanelType type);

	/**
	 * The menu new game event is emitted when the user selects the new game
	 * menu entry
	 * 
	 * @return the event
	 */
	public IEvent getMenuNewGameEvent();

	/**
	 * The menu quit event is emitted when the user selects the quit menu entry
	 * 
	 * @return the event
	 */
	public IEvent getMenuQuitEvent();

	/**
	 * The load event is emitted when the user wants to load a previously saved
	 * game state
	 * 
	 * @return the event
	 */
	public IEvent getLoadEvent();

	/**
	 * The save event is emitted when the user wants to save the current game
	 * state
	 * 
	 * @return the event
	 */
	public IEvent1<File> getSaveEvent();

	/**
	 * The pause event is emitted when the user wants to pause the current turn
	 * 
	 * @return the event
	 */
	public IEvent getPauseEvent();

	/**
	 * The end pause event is emitted when the user wants to sresume the game
	 * after a pause
	 * 
	 * @return the event
	 */
	public IEvent getEndPauseEvent();

	/**
	 * Hides all view elements and panels except for the cleared table and an
	 * empty hand panel
	 */
	public void clearView();

	/**
	 * The network game event is emitted when the user chooses a network game
	 * 
	 * @return the event
	 */
	public IEvent getNetworkGameEvent();

	/**
	 * Getter for login panel
	 * 
	 * @return login panel
	 */
	public ILoginPanel getLoginPanel();

	/**
	 * Getter for game list panel
	 * 
	 * @return game list panel
	 */
	public IGameListPanel getGameListPanel();

	/**
	 * Show/hide login panel
	 * 
	 * @param show
	 *            true = login panel is shown
	 */
	public void showLoginPanel(boolean show);

	/**
	 * Enable/disable pause mode
	 * 
	 * @param enable
	 *            true = enable
	 */
	public void enablePauseMode(boolean enable);

	/**
	 * Show/hide game list panel
	 * 
	 * @param show
	 *            true = show
	 */
	public void showGameListPanel(boolean show);

	/**
	 * Show/hide side panel
	 * 
	 * @param show
	 *            true to show
	 */
	void showSidePanel(boolean show);

	/**
	 * Is set if a player tried to lay out less than initial meld threshold
	 * 
	 * @param points
	 *            initial meld threshold
	 */
	public void setInitialMeldError(int points);

	/**
	 * Show stone collection
	 * 
	 * @param enable
	 *            showing collection
	 */
	public void setStoneCollectionHidden(boolean enable);

	/**
	 * Is set if the player tried to modify the table without laying out first
	 */
	public void setInitialMeldFirstError();

	/**
	 * Set invalid sets to enable showing
	 * 
	 * @param sets
	 *            invalid sets on table
	 */
	public void setInvalidStoneSets(Collection<StoneSet> sets);

	/**
	 * Show when loading is unsuccessful
	 */
	public void showLoadingError();

	/**
	 * Enables/disables saving in menu bar
	 * 
	 * @param enable
	 *            saving possible
	 */
	public void enableSave(boolean enable);

	/**
	 * Sets the quit warning panel visible
	 * 
	 * @param show
	 *            is visible
	 */
	public void showQuitWarningPanel(boolean show);

	/**
	 * The quit event is emitted when the user wants to leave the application
	 * 
	 * @return the event
	 */
	public IEvent getQuitEvent();

	/**
	 * Getter for quit warning panel
	 * 
	 * @return the panel
	 */
	public IQuitWarningPanel getQuitWarningPanel();

	/**
	 * The load file event is emitted when the user chose to discard the current
	 * game to save another
	 * 
	 * @return the event
	 */
	public IEvent1<File> getLoadFileEvent();

	/**
	 * Loading a game
	 */
	public void load();

	/**
	 * Set the connect panel visible
	 * 
	 * @param show
	 *            is visible
	 */
	public void showConnectPanel(boolean show);

	/**
	 * Getter for connect panel
	 * 
	 * @return the panel
	 */
	public IConnectPanel getConnectPanel();

	/**
	 * Different types of bottom panels
	 */
	public enum BottomPanelType {
		/** */
		START_GAME_PANEL,
		/** */
		START_TURN_PANEL,
		/** */
		INVALID_TURN_PANEL,
		/** */
		HUMAN_HAND_PANEL,
		/** */
		NONHUMAN_HAND_PANEL,
		/** */
		WIN_PANEL
	}
}
