import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;

public class Karte
{
    /**
     * Konstanten für die vier Kartenfarben
     */
    public static final int PIK = 0;
    public static final int KREUZ = 1;
    public static final int HERZ = 2;
    public static final int KARO = 3;

    /**
     * Konstanten für die Maße der Karte
     */
    public static final int CARD_WIDTH = 100;
    public static final int CARD_HEIGHT = 150;

    final private int farbe;
    final private int wert;
    private BufferedImage image;
    private boolean markiert;

    /**
     * Erzeugt eine neue Karte
     * @param nummer Das als Zahl codierte Bild der Karte
     */
    public Karte(int nummer)
    {
        final String[] suits = { "spades", "clubs", "hearts", "diamonds"};
        farbe = nummer / 13;
        wert = nummer % 13 + 1;
        markiert = false;
        String path = "";
        try
        {
            path = "img/"+String.format("%02d", wert)+"_of_"+suits[farbe]+".png";
            image = ImageIO.read(new File(path));
        }catch(Exception x){
            System.out.println(path);
            System.out.println(x.getMessage());
        }
    }

    /**
     * Zeichnet die Karte an der Position (x,y) auf das Graphics-Objekt g.
     * Sollte nicht direkt aufgerufen werden.
     * @param g Das Graphics-Objekt, auf das gezeichnet wird
     * @param x Die x-Koordinate der oberen linken Ecke
     * @param y Die y-Koordinate der oberen linken Ecke
     */
    public void zeichne(Graphics g, int x, int y)
    {
        if (image != null) {
            g.drawImage(image, x, y, CARD_WIDTH, CARD_HEIGHT, null);
        } // end of if
        else
        {
            g.setColor(Color.RED);
            g.fillRoundRect(x, y, CARD_WIDTH, CARD_HEIGHT, 8, 8);   
        }
        g.setColor(markiert ? Color.BLUE : Color.BLACK);
        ((Graphics2D)g).setStroke(new BasicStroke(markiert ? 5 : 1));
        g.drawRoundRect(x, y, CARD_WIDTH, CARD_HEIGHT, 8, 8);   
        ((Graphics2D)g).setStroke(new BasicStroke(1));
    }

    /**
     * Gibt an, ob die Karte vom Spieler markiert (angeklickt) wurde
     */
    public boolean getMarkiert()
    {
        return markiert;
    }

    /**
     * Setzt die Karte auf markiert/unmarkiert
     * @param b true = markiert; false = unmarkiert
     */
    public void setMarkiert(boolean b)
    {
        markiert = b;
    }

    /**
     * Gibt den Zahlwert der Karte zurück
     * @return Der Zahlwert der Karte (1 = As, 2-10, 11 = Bube, 12 = Dame, 13 = König)
     */
    public int getWert()
    {
        return wert;
    }

    /**
     * Gibt die Farbe der Karte zurück
     * @return Einer der Werte PIK, KREUZ, HERZ, KARO 
     */
    public int getFarbe()
    {
        return farbe;
    }

    /**
     * Gibt zurück, ob es sich um eine rote Karte (Herz oder Karo) handelt
     * @return true für eine rote Karte, false für eine schwarze
     */
    public boolean istRot()
    {
        return farbe == HERZ || farbe == KARO;
    }
}