import java.util.ArrayList;
import java.awt.*;

/**
 * Beschreiben Sie hier die Klasse Figuren.
 * 
 * @author Rainer Helfrich
 * @version 1.0
 */
public class Figuren extends FigurenBase
{
    ArrayList<Figur> figuren;

    /**
     * Konstruktor für Objekte der Klasse Figuren
     * Initialisiert das Projekt
     */
    public Figuren()
    {
        figuren = new ArrayList<Figur>();
    }

    public static final int TYP_QUADRAT = 0;
    public static final int TYP_KREIS = 1;
    public static final int TYP_MICKYMAUS = 2;

    /**
     * Wird aufgerufen, wenn der Benutzer mit der linken Maustaste auf die Zeichenfläche klickt.
     * @param x     Die x-Koordinate des Klicks
     * @param y     Die y-Koordinate des Klicks
     * @param typ   Der Typ des Objekts, das erzeugt werden soll (kann TYP_QUADRAT, TYP_KREIS oder TYP_MICKYMAUS sein)
     * @param farbe Die Farbe, mit der das Objekt gefüllt werden soll
     * @param rand  Die Farbe des Randes; null, wenn kein Rand gezeichnet werden soll 
     */
    public void neueFigur(int x, int y, int typ, int groesse, Color farbe, Color rand)
    {
        if (typ == TYP_KREIS)
        {
            if (rand != null){
                figuren.add(new RandKreis( x, y, groesse, farbe, rand));
            }else {
                figuren.add(new Kreis(x, y, groesse, farbe));
            }

        }
        else if (typ == TYP_QUADRAT)
        {
            if (rand != null){
            figuren.add(new RandQuadrat(x, y, groesse, farbe, rand));    
            }else {
            figuren.add(new Quadrat(x, y, groesse, farbe));    
            }
            } else if (typ == TYP_MICKYMAUS) {
            if (rand != null){
            figuren.add(new MickyMausRand(x, y, groesse, farbe, rand));
            }else {
            figuren.add(new MickyMaus(x , y, groesse, farbe));    
            }
}

}

    /**
     * Wird jedes Mal aufgerufen, wenn die Grafik neu gezeichnet werden soll.
     * @param g     Die Zeichenfläche.
     */
    public void zeichnen(Graphics g)
    {
        for (Figur f : figuren)
        {
            f.zeichneDich(g);
        }
    }
    
    /**
     * Gibt die Anzahl der Figuren im Bild zurück. 
     * Wird für die Auswahl der Figuren beim Verschieben benötigt
     * @return  Die Anzahl der Figuren im Bild.
     */
    public int getAnzahlFiguren()
    {
        return figuren.size();
    }
    
    /**
     * Verschiebt ein Objekt um bestimmte x- und y-Werte
     * @param nummer    Die Nummer des Objekts in der Liste
     * @param x         Die Verschiebung in x-Richtung in Pixeln
     * @param y         Die Verschiebung in y-Richtung in Pixeln
     */
    public void verschiebeUm(int nummer, int x, int y)
    {
        if (nummer >= 0 && nummer < figuren.size())
        {
            figuren.get(nummer).verschiebeUm(x, y);
        }
    }
    
    /**
     * Verschiebt ein Objekt an bestimmte Koordinaten
     * @param nummer    Die Nummer des Objekts in der Liste
     * @param x         Die x-Koordinate der neuen Position
     * @param y         Die y-Koordinate der neuen Position
     */
    public void verschiebeNach(int nummer, int x, int y)
    {
        if (nummer >= 0 && nummer < figuren.size())
        {
            figuren.get(nummer).verschiebeNach(x, y);
        }
    }

    /**
     * Wird aufgerufen, wenn der Benutzer mit der rechten Maustaste auf die Zeichenfläche klickt.
     * @param x     Die x-Koordinate des Klicks
     * @param y     Die y-Koordinate des Klicks
     */
    public void figurLoeschen(int x, int y)
    {
        for (Figur f : figuren)
        {
            if (f.enthaeltPunkt(x, y))
            {
                figuren.remove(f);
                return;
            }
        }
    }

    /**
     * Sortiert alle Figuren aufsteigend nach ihrem Flächeninhalt und gibt ihre Beschreibung auf der Konsole aus.
     */
    public void ausgeben()
    {
        java.util.Collections.sort(figuren);
        for(Figur f: figuren)
        {
            System.out.println(f);
        }
    }
}
