/*
 * Created on Dec 18, 2003
 */
package lotto;

import java.util.*;
import com.aspectprogramming.contract4j.*;

/**
 * Die Lotto-Klasse dient auch als kleines Beispiel fuer Contract4J.
 * Contract4J braucht zwar Java5, da es auf Annotations aufsetzt, allerdings
 * hat es Probleme mit Generics, speziel mit '<' und '>'.
 * 
 * @author oliver (boehm@javatux.de)
 * @see http://www.contract4j.org
 */
@Contract
@Invar("$this.gezogen <= 6")
public class Trommel {
    
    //private Vector<Integer> balls = null;
    private Vector balls = null;
    
    /** Anzahl der gezogenen Kugeln */
    private int gezogen = 0;

    Trommel() {
        init();
    }

    private void init() {
        //balls = new Vector<Integer>(49);
        balls = new Vector(49);
        for (int i = 1; i <= 49; i++) {
            balls.add(new Integer(i));
        }
    }
    
    /**
     * Der Mischvorgang laueft so ab, dass eine beliebige Kugel gezogen wird
     * und am Ende wieder eingefuegt wird.
     */
    public void mixNumbers() {
        mixNumbers(10);
    }
    
    /**
     * mische...mische...mische...
     * @param n wie oft gemischt wird
     */
    public void mixNumbers(int n) {
        for (int i = 0; i < n; i++) {
            Integer ballnumber = this.getNumber();
            gezogen--;  // Kugel kommt wieder zurueck in die Trommel
            balls.add(ballnumber);
        }
    }
    
    /**
     * ...und hier die Ziehung der Lottozahlen.
     * @return
     */
    @Pre(value="$this.gezogen <= 5")
    @Post(value="($return.intValue() >= 1) && ($return.intValue() <= 49)")
    public Integer getNumber() {
        Random random = new Random(System.currentTimeMillis());
        int n = random.nextInt(balls.size());
        gezogen++;
        return (Integer) balls.remove(n);
    }
    
    /**
     * @return Anzahl der Kugeln in der Trommel
     */
    public int getAnzahlKugelnInside() {
        return balls.size();
    }
    
    /**
     * @return Anzahl der Kugeln ausserhalb der Trommel
     */
    public int getAnzahlKugelnOutside() {
        return gezogen;
    }
    
    public String toString() {
        String s = "";
        for (int i = 1; i < balls.size(); i++) {
            s += " " + balls.get(i);
        }
        return balls.firstElement().toString() + s;
    }

    public static void main(String[] args) {
        System.out.print("Ziehung:");
        Trommel trommel = new Trommel();
        for (int i = 0; i < 7; i++) {
            trommel.mixNumbers();
            System.out.print(" " + trommel.getNumber());
        }
        System.out.println();
    }
}
