package server;

import java.rmi.Remote;
import java.rmi.RemoteException;

import client.ClientSpielEinleitungsKommunikator;
import client.ClientSpielLeiterKommunikator;
import client.ClientSpielKommunikator;

/**
 * Der ServerKommunikator dient zur Kommunikation zwischen dem Client und dem Server
 * während der Spielauswahlphase. Der Client Kann ein neues Spiel erstellen,
 * oder einem bestehenden Spiel beitreten.
 *
 *  @version 1.1
 *  @author ProgPrak-Team
 */

public interface ServerKommunikator extends Remote {
	
	/**
	 * Mit dieser Methode kann sich der Client vom Server abmelden.
	 * Der Client verlässt alle Spiele die er beobachtet, oder in denen er mitspielt.
	 */
	public void abmelden() throws RemoteException;

	/**
	 * Der Server erstellt ein neues Spiel und gibt dem Spielleiter den {@link ServerSpielLeiterKommunikator}
	 * um das Spiel zu konfigurieren. Der Server bekommt den {@link ClientSpielLeiterKommunikator} um dem 
	 * Client die möglichen SpielVarianten zu liefern.
	 * @param clientSpielKommunikator der SpielleiterKommunikator des Clients
	 * @param spielName der Name des neuen Spiels
	 * @return der ServerSpielLeiterKommunikator, mit dem der Client das Spiel konfigurieren kann
	 */
	public ServerSpielLeiterKommunikator neuesSpiel(ClientSpielLeiterKommunikator clientSpielKommunikator, String spielName) throws RemoteException;

	/**
	 * Der Server trägt den Client in das gewählte Spiel ein und gibt dem Client einen neuen
	 * {@link ServerSpielEinleitungsKommunikator}.
	 * 
	 * @param clientSpielEinleitung {@link ClientSpielEinleitungsKommunikator} zur Kommunikation in der Spieleinleitungsphase
	 * @param spielName Name des Spiels, in das der Client einsteigen möchte
	 * @return der {@link ServerSpielKommunikator} mit dem der Client in der Spieleinleitungsphase kommuniziert
	 */
	public ServerSpielEinleitungsKommunikator betreteSpiel(ClientSpielEinleitungsKommunikator clientSpielEinleitung, String spielName) throws RemoteException;

	/**
 	 * Der Server trägt den Client in das gewählte Spiel als Beobachter ein und gibt dem Client einen neuen
	 * {@link ServerSpielEinleitungsKommunikator}.
	 * 
	 * @param clientSpielEinleitung {@link ClientSpielEinleitungsKommunikator} zur Kommunikation in der Spieleinleitungsphase
	 * @param spielName Name des Spiels, das der Client beobachten möchte
	 * @return der {@link ServerSpielKommunikator} mit dem der Client in der Spieleinleitungsphase kommuniziert
	 */
	public ServerSpielEinleitungsKommunikator beobachteSpiel(ClientSpielEinleitungsKommunikator clientSpielEinleitung, String spielName) throws RemoteException;
}
