import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JPanel;
import javax.swing.JOptionPane;

public class SudokuCanvas extends JPanel 
{ 
  private int ligne, col;
  private String essai;
  private int[][] matrice;
  private boolean[][] contraintes;
  
  public SudokuCanvas(int[][] matrice, boolean[][] contraintes) 
  {
    this.matrice = matrice;
    this.contraintes = contraintes;
    ligne = 0;
    col = 0;
    essai = "";     
  }
  
  public void paintComponent(Graphics g) 
  {
    super.paintComponent(g);
    drawBoard(g);
    drawPuzzle(g);
    if (!essai.equals("0"))
      writeNumber(g, ligne, col, essai, Color.blue);
  }
  
  private void drawBoard(Graphics g) 
  {
    final int factor = 40;
    for (int i = 0; i <= 9; i++) 
    {
      g.setColor(Color.black);
      g.drawLine(0, i * factor, 9 * factor, i * factor);
      g.drawLine(i * factor, 0, i * factor, 9 * factor);
    }
    
    for (int n = 0; n <= 3; n++) 
    {
      g.setColor(Color.red);
      g.drawLine(0, 1 + n * factor * 3, 9 * factor, 1 + n * factor * 3);
      g.drawLine(1 + n * factor * 3, 0, 1 + n * factor * 3, 9 * factor);
    }
    
  }
  
  private  void drawPuzzle(Graphics g) 
  {
    final int factor = 40;
    g.setFont(new Font("Serif", Font.BOLD, 30));
    g.setColor(Color.black);
    for (int i = 0; i < 9; i++)
    {
      for (int j = 0; j < 9; j++) 
      {
        if (matrice[i][j] != 0) 
        {
          if (contraintes[i][j])
          {
            g.setColor(Color.red);
          }
          else
          {
            g.setColor(Color.black);
          }
          g.drawString(String.valueOf(matrice[i][j]), 12 + j * factor, 30 + i * factor);
        }
        else
        {
          ; // do nothing
        }
      }
    }
  }
  
  private void writeNumber(Graphics g, int l, int c, String number, Color color) 
  {
    final int factor = 40;
    g.setFont(new Font("Serif", Font.BOLD, 30));
    g.setColor(color);
    if (!number.equals("")) 
    {
      int temp = Integer.parseInt(number);
      g.drawString(String.valueOf(temp), 12 + c * factor, 30 + l * factor);
    }
    else
    {
      ; // ne rien faire
    }
  }
  
  public void updateMove(int l, int c, int e) 
  {
    ligne = l-1;
    col = c-1;
    
    if (SudokuLib.verifyGuess(ligne, col, e, matrice, contraintes, true)) 
    {
      matrice[ligne][col] = e;
      essai = e+""; // convertit e en String
      repaint();
      if (SudokuLib.solved(matrice))
      {
        JOptionPane.showMessageDialog(null, "Congratulations!!! You solved this Sudoku grid!"); // ENGLISH        
      }
      else 
      {
        ; // do nothing
      }
    }
    else 
    {
      ; // do nothing 
    }
  }
  
}
