import javax.swing.*;
import java.awt.*;

/**
 * Ein Panel, in dem das Sudoku-Spiel gezeichnet wird.
 * Hier sollte nichts verändert werden.
 * @author Rainer Helfrich
 * @version Dezember 2020
 */
public class SudokuPanel extends JPanel
{
    /**
     * Das Spiel, das dargestellt werden soll
     */
    private SudokuGitter dasSpiel;

    /**
     * Erzeugt ein neues Panel
     * @param s Das Spiel, das dargestellt werden soll.
     */
    public SudokuPanel(SudokuGitter s)
    {
        dasSpiel = s;
    }

    /**
     * Zeichnet das Spiel auf ein Graphics-Objekt
     * @param gg Das Graphics-Objekt, auf das gezeichnet werden soll
     */
    public void paintComponent(Graphics gg)
    {
        Graphics2D g = (Graphics2D)gg;
        g.setColor(Color.WHITE);
        g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(Color.BLACK);
        g.setStroke(new BasicStroke(5));
        int w = getWidth()-5;
        int h = getHeight()-5;
        g.drawRect(2, 2, w/3, h);
        g.drawRect(2+w/3, 2, w/3, h);
        g.drawRect(2+2*w/3, 2, getWidth()-2*w/3-5, h);
        g.drawRect(2, 2, w, h/3);
        g.drawRect(2, 2+h/3, w, h/3);
        g.drawRect(2, 2+2*w/3, w, getHeight()-2*h/3-5);
        g.setStroke(new BasicStroke(2));
        for (int i = 1; i < 9; i++) {
            g.drawLine(2+i*w/9, 2, 2+i*w/9, h);
            g.drawLine(2, 2+i*h/9, w, 2+i*h/9);
        }
        int cellWidth = w/9;
        int cellHeight = h/9;
        for (int i = 0; i < 9; i++)
        {
            int x = 2+i*w/9;
            for (int j = 0; j < 9; j++)
            {
                int y = 2+j*h/9;
                Eintrag e = dasSpiel.getEintrag(i, j);
                if (e == null)
                {
                    continue;
                }
                Rectangle r = new Rectangle(x+5, y+5, cellWidth-10, cellHeight-10);
                e.zeichneDich(gg, r);
            }
        }
    }

    /**
     * Zeichnet einen String in einem Rechteck zentriert auf ein Graphics-Objekt
     * @param g Das Graphics-Objekt, auf das gezeichnet werden soll
     * @param text Der zu zeichnende Text
     * @param rect Der Bereich, in den der Text zentriert werden soll
     */
    public static void drawCenteredString(Graphics g, String text, Rectangle rect) {
        drawCenteredString(g, text, rect.x, rect.y, rect.width, rect.height);
    }

    /**
     * Zeichnet einen String in einem Rechteck zentriert auf ein Graphics-Objekt
     * @param g Das Graphics-Objekt, auf das gezeichnet werden soll
     * @param text Der zu zeichnende Text
     * @param x x-Koordinate der linken oberen Ecke des Rechtecks
     * @param y y-Koordinate der linken oberen Ecke des Rechtecks
     * @param w Breite des Rechtecks
     * @param h Höhe des Rechtecks
     */
    public static void drawCenteredString(Graphics g, String text, int x, int y, int w, int h) {
        // Get the FontMetrics
        FontMetrics metrics = g.getFontMetrics();
        // Determine the X coordinate for the text
        x += (w - metrics.stringWidth(text)) / 2;
        // Determine the Y coordinate for the text (note we add the ascent, as in java 2d 0 is top of the screen)
        y += ((h - metrics.getHeight()) / 2) + metrics.getAscent();
        // Draw the String
        g.drawString(text, x, y);
    }

}