/******************************************************************************
 ** $Id: Bot.java 1017 2016-05-28 20:35:09Z wmh $
 ** Diese Datei ist Bestandteil der Java-Quelltexte des Würfelspiels JaFuffy.
 ** Lauffähig ab Java 7.
 ******************************************************************************
 ** Copyright (C) Wolfgang Hauck <wolfgang.hauck@3kelvin.de>
 ******************************************************************************
 ** 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 3 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 should have received a copy of the GNU General Public License
 ** along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************
 ** Die aktuellste Version von JaFuffy findet sich im Internet unter
 ** <http://jafuffy.3kelvin.de>.
 **
 ** Kommentare, Fehler oder Erweiterungswünsche bitte per E-Mail senden an
 ** <jafuffy@3kelvin.de>.
 ******************************************************************************/
package jafuffy.logik;

import java.util.Arrays;

import jafuffy.Eigenschaften;

/** Roboter, welcher die Rolle des Spielers übernimmt. */
public class Bot extends Spieler {

    /** Objekt ist serialisierbar. */
    private static final long serialVersionUID = 9219523837494133853L;

    /** Aufzählung der verfügbaren Spielstärken für die Bots. */
    public enum Spielstaerke {
        /** Mäßig. */
        MAESSIG("mäßig"),
        /** Gut. */
        GUT("gut"),
        /** Stark. */
        STARK("stark");

        /** Die lesbare Bezeichnung der Spielstärke. */
        private final String bezeichnung;

        /**
         * Konstruktion mit einer lesbaren Bezeichnung.
         *
         * @param bezeichnung
         *            Die lesbare Bezeichnung.
         */
        Spielstaerke(String bezeichnung) {
            this.bezeichnung = bezeichnung;
        }

        @Override
        public String toString() {
            return bezeichnung;
        }
    }

    /** Namen für die Spieler, die von der künstlichen Intelligenz betrieben werden. */
    public static final String[] BOTNAMEN = { "Annabot", "Bennobot", "Clarabot", "Dragobot" };

    /** Anzahl der verfügbaren Stärkeintervalle. */
    private static final int N = Bot.Spielstaerke.values().length - 1;
    /** Maximale Unsicherheit. */
    private static final double MAXIMUM = 0.8;
    /** Schrittweite für Spielstärkenverteilung. */
    private static final double SCHRITT = MAXIMUM / N;

    /** Die globalen, persistenten Einstellungen von JaFuffy. */
    private final Eigenschaften eigenschaften;

    /**
     * Konstruktor.
     *
     * @param eigenschaften
     *            Die globalen, persistenten Einstellungen von JaFuffy.
     * @param name
     *            Name des Bots.
     * @param max
     *            Die maximale Anzahl der Möglichkeiten zu würfeln.
     */
    public Bot(Eigenschaften eigenschaften, String name, int max) {
        super(name, max);
        this.eigenschaften = eigenschaften;
    }

    @Override
    public boolean menschlich() {
        return false;
    }

    @Override
    double prognoseunsicherheit() {
        String botstaerke = eigenschaften.getProperty("Botstaerke" + Arrays.asList(BOTNAMEN).indexOf(toString()));
        int staerkenindex = Bot.Spielstaerke.valueOf(botstaerke).ordinal();
        return (N - staerkenindex) * SCHRITT;
    }

}
