package litebrite.acmbased;

import acm.graphics.*;
import acm.program.GraphicsProgram;
import java.awt.Color;
import java.awt.event.MouseEvent;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import litebrite.ColorNamePair;

public class LiteBrite extends GraphicsProgram
{
  private static final int NUMBER_OF_ROWS = 20;
  private static final int NUMBER_OF_COLUMNS = 20;
  private static final Color DEFAULT_COLOR = Color.white;
  private static final int WINDOW_WIDTH = 500;
  private static final int WINDOW_HEIGHT = 500;
  private JComboBox colorBox;

  @Override
  public void init()
  {
    // Set the size of the window
    setSize(WINDOW_WIDTH, WINDOW_HEIGHT);

    // Add a label for the combo box
    add(new JLabel("Color: "), NORTH);

    // Make a combo box for picking the current color
    colorBox = new JComboBox(ColorNamePair.COLOR_LIST);
    add(colorBox, NORTH);

    // Add a black background
    GRect background = new GRect(WINDOW_WIDTH,
                                 WINDOW_HEIGHT);
    background.setColor(Color.black);
    background.setFilled(true);
    add(background);

    // Determine how big each block is
    double blockWidth = WINDOW_WIDTH / (double) NUMBER_OF_COLUMNS;
    double blockHeight = WINDOW_HEIGHT / (double) NUMBER_OF_ROWS;

    // Add all of the blocks to the canvas
    for (int row = 0; row < NUMBER_OF_ROWS; row++)
    {
      for (int column = 0; column < NUMBER_OF_COLUMNS; column++)
      {
        GRoundRect rect = new GRoundRect(column * blockWidth,
                                         row * blockWidth,
                                         blockWidth, blockHeight);
        rect.setFilled(true);
        rect.setColor(Color.black);
        rect.setFillColor(DEFAULT_COLOR);
        add(rect);
      }
    }

    addMouseListeners();
  }

  @Override
  public void mousePressed(MouseEvent e)
  {
    fillObjectAt(e.getX(), e.getY());
  }

  @Override
  public void mouseDragged(MouseEvent e)
  {
    fillObjectAt(e.getX(), e.getY());
  }

  private void fillObjectAt(int x, int y)
  {
    // Find the object at the given position
    GObject gObject = getElementAt(x, y);

    // If there was a fillable object at the given position set its color to be
    // the color currently selected in the combo box
    if (gObject != null && gObject instanceof GFillable)
    {
      ((GFillable) gObject).setFillColor(((ColorNamePair) colorBox.getSelectedItem()).getColor());
    }
  }
}
