/**
 * Eine Klasse, die das Verhalten eines Client/Server Systems lokal imitiert.
 <br>
 * Besitzt die gleichen Schnittstellen wie die Netzwerkversion (auch wenn ggf.
 * nicht alle Parameter benötigt werden) und kann so einfach gegen diese
 * ausgetauscht werden.<br>
 * Genauso wie bei der Netzwerk version, ist es zunächst nötig, einen Server zu
 * erstellen, bevor der Client lokal dazustößt. <br>
 * Im Gegensatz zur Netzwerkversion ist es hier möglich, dass der Client-Prozess
 * Änderungen an den Serverdaten durchführt. Das sollte in der Praxis jedoch
 * nicht gemacht werden, da spätestens beim Austausch der Klassen ein Problem
 * entsteht!
 *
 @author Andre Greubel
 */
public class SpielDaten {

    private static double[] clientDoubles;
    private static int[] clientInts;
    private static String[] clientStrings;

    private static double[] serverDoubles;
    private static int[] serverInts;
    private static String[] serverStrings;

    private static SpielDaten instance;

    private SpielDaten(int serverInts, int serverDoubles, int serverStrings, int clientInts, int clientDoubles, int clientStrings) {
        this.serverInts = new int[serverInts];
        this.serverDoubles = new double[serverDoubles];
        this.serverStrings = new String[serverStrings];
        for (int i = 0; i < serverStrings; i++) {
            this.serverStrings[i"";
        }

        this.clientInts = new int[clientInts];
        this.clientDoubles = new double[clientDoubles];
        this.clientStrings = new String[clientStrings];
        for (int i = 0; i < clientStrings; i++) {
            this.clientStrings[i"";
        }
    }

    public double getClientDouble(int clientNr, int doubleNr) {
        return clientDoubles[doubleNr];
    }

    public int getClientInt(int clientNr, int intNr) {
        return clientInts[intNr];
    }

    public String getClientString(int clientNr, int stringNr) {
        return clientStrings[stringNr];
    }

    public int getMyId() {
        return 0;
    }

    public double getServerDouble(int nr) {
        return serverDoubles[nr];
    }

    public String getServerString(int nr) {
        return serverStrings[nr];
    }

    public int getServerInt(int nr) {
        return serverInts[nr];
    }

    public void setMyDouble(int nr, double content) {
        clientDoubles[nr= content;
    }

    public void setMyInt(int nr, int content) {
        clientInts[nr= content;
    }

    public void setMyString(int nr, String content) {
        serverStrings[nr= content;
    }

    public void setServerDouble(int nr, double content) {
        serverDoubles[nr= content;
    }

    public void setServerInt(int nr, int content) {
        serverInts[nr= content;
    }

    public void setServerString(int nr, String content) {
        serverStrings[nr= content;
    }

    public static SpielDaten starteServer(int serverInts, int serverDoubles, int serverStrings, int clientInts, int clientDoubles, int clientStrings) {
        if (instance != null) {
            throw new IllegalArgumentException("Server läuft bereits!");
        }
        instance = new SpielDaten(serverInts, serverDoubles, serverStrings, clientInts, clientDoubles, clientStrings);
        return instance;
    }

    public static SpielDaten verbindeMitServer(String ip) {
        if (instance == null) {
            throw new IllegalArgumentException("Verbindung zum Server nicht möglich: Server läuft noch nicht!");
        }
        return instance;
    }

}