package pr2.collections.iterieren;

import de.smits_net.games.framework.board.Board;
import de.smits_net.games.framework.image.SimpleImage;
import de.smits_net.games.framework.sprite.Sprite;
import de.smits_net.games.framework.sprite.Sprite.BoundaryPolicy;

import java.awt.Point;
import java.util.Iterator;
import java.util.Random;

/**
 * Klasse, die eine beliebige Menge an Geld generiert.
 */
public class CoinGenerator implements Iterable<Sprite> {

    /**
     * Zufallszahlen-Generator.
     */
    private static final Random RND = new Random();

    /**
     * Das Spielfeld.
     */
    private final Board board;

    /**
     * Anzahl der Münzen, die erzeugt werden sollen.
     */
    int number; // nicht private wegen innerer Klasse

    /**
     * Erzeugt eine neue Instanz, die zu dem übergebenen Spielfeld gehört.
     *
     * @param board  Das Spielfeld.
     * @param number Anzahl der Münzen.
     */
    public CoinGenerator(Board board, int number) {
        this.board = board;
        this.number = number;
    }

    /**
     * Erzeugt einen neuen Iterator.
     *
     * @return Der Iterator.
     */
    @Override
    public Iterator<Sprite> iterator() {
        return new Iterator<Sprite>() {

            int count = 0;

            @Override
            public boolean hasNext() {
                return count < number;
            }

            @Override
            public Sprite next() {
                count++;
                return createCoin();
            }
        };
    }

    /**
     * Legt eine zufällige Münze an.
     *
     * @return die Münze als Sprite.
     */
    Sprite createCoin() {
        final String prefix = "pr2/collections/iterieren";

        String asset;

        switch (RND.nextInt(8)) {
            case 0:
                asset = prefix + "/1c.png";
                break;
            case 1:
                asset = prefix + "/2c.png";
                break;
            case 3:
                asset = prefix + "/5c.png";
                break;
            case 4:
                asset = prefix + "/10c.png";
                break;
            case 5:
                asset = prefix + "/20c.png";
                break;
            case 6:
                asset = prefix + "/50c.png";
                break;
            case 7:
                asset = prefix + "/1e.png";
                break;
            default:
                asset = prefix + "/2e.png";
                break;
        }

        int xPos = RND.nextInt(board.getWidth()) - 20;
        int yPos = RND.nextInt(board.getHeight()) - 20;

        return new Sprite(board, new Point(xPos, yPos), BoundaryPolicy.NONE,
                new SimpleImage(asset)) {
            @Override
            protected void mousePressed() {
                this.setVisible(false);
            }
        };
    }
}
