package queenproblem;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

/**
 * @author Daniel "3ICE" Berezvai
 */
public class QueenProblemFrame extends JFrame {

  private final int N = 8;
  private ChessBoardButton[][] buttons;

  public QueenProblemFrame() {
    super();
    setTitle(N + "-queen Problem");
    setLocation(40, 40);
    setSize(600, 400);
    setLayout(new BorderLayout());
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    buttons = new ChessBoardButton[N][N];
    makeChessBoard();
  }

  private void makeChessBoard() {
    JPanel panel = new JPanel(new GridLayout(N, N));
    for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++) {
        ChessBoardButton btn = new ChessBoardButton(i, j);
        btn.addActionListener(chessBoardButtonActionListener);
        buttons[i][j] = btn;
        panel.add(btn);
      }
    }
    getContentPane().add(panel, BorderLayout.CENTER);
  }
  private ActionListener chessBoardButtonActionListener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      ChessBoardButton btn = (ChessBoardButton) e.getSource();
      btn.setQueenInverse();
      setEnabledButtons();
    }
  };

  void setEnabledButtons() {
    for (ChessBoardButton[] chessBoardButtonRows : buttons) {
      for (ChessBoardButton chessBoardButton : chessBoardButtonRows) {
        chessBoardButton.setEnabled(true);
      }
    }
    for (ChessBoardButton[] chessBoardButtonRows : buttons) {
      for (ChessBoardButton chessBoardButton : chessBoardButtonRows) {
        if (chessBoardButton.isQueen()) {
          int pointX = chessBoardButton.getPointX();
          int pointY = chessBoardButton.getPointY();
          for (int i = 0; i < N; i++) {
            buttons[pointX][i].setEnabled(false);
            buttons[i][pointY].setEnabled(false);
          }
          while (pointX > 0 && pointY > 0) {
            pointX--;
            pointY--;
          }
          while (pointX < N && pointY < N) {
            buttons[pointX++][pointY++].setEnabled(false);
          }
          pointX = chessBoardButton.getPointX();
          pointY = chessBoardButton.getPointY();
          while (pointX > 0 && pointY < N - 1) {
            pointX--;
            pointY++;
          }
          while (pointX < N && pointY >= 0) {
            buttons[pointX][pointY].setEnabled(false);
            pointY--;
            pointX++;
          }
          //This is smarter than checking if i == pointX || i == pointY in every loop.
          chessBoardButton.setEnabled(true);
        }
      }
    }
  }
}
