/**
 * Copyright (C) 2004-2011 Jive Software. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package tic.tac.toe.ui;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

import tic.tac.toe.Mark;
import tic.tac.toe.Pair;

/**
 * The Gui to the Logical Board
 * 
 * @author wolf.posdorfer
 * @version 16.06.2011
 */
public class GameBoardPanel extends JPanel {

    private static final long serialVersionUID = -178497456422566485L;

    private final Image _backgroundimage;

    private final JLabel[][] _labels;

    private final GamePanel _owner;

    public GameBoardPanel(GamePanel gamepanel) {

	_owner = gamepanel;

	setLayout(new GridLayout(3, 3));

	_labels = new JLabel[3][3];

	for (int x = 0; x < 3; x++) {
	    for (int y = 0; y < 3; y++) {
		JLabel toadd = new JLabel(Mark.BLANK.getImage());
		toadd.setOpaque(false);

		final int xx = x;
		final int yy = y;

		toadd.addMouseListener(new MouseAdapter() {
		    @Override
		    public void mouseClicked(MouseEvent e) {
			if (_owner.myTurn() && _owner.isFree(xx, yy)) {
			    placeMark(_owner.getMyMark(), xx, yy);
			}
		    }

		});

		_labels[x][y] = toadd;

		add(_labels[x][y]);
	    }
	}

	ClassLoader cl = getClass().getClassLoader();
	_backgroundimage = new ImageIcon(cl.getResource("board.png"))
		.getImage();

	setPreferredSize(new Dimension(500, 500));

    }

    /**
     * Places the Mark, and tells the Owner to place the mark on the logical
     * board
     * 
     * @param m
     * @param x
     * @param y
     */
    public void placeMark(Mark m, int x, int y) {

	_labels[x][y].setIcon(m.getImage());

	// Notify the Owner about Change
	_owner.onGameBoardPlaceMark(m, x, y);

	this.invalidate();
	this.repaint();
	this.revalidate();
    }
    
    public void colorizeWinners(Pair[] pairs)
    {
	if(pairs!=null)
	{
	    for(Pair p : pairs)
	    {
		_labels[p.getX()][p.getY()].setIcon(p.getMark().getRedImage());
	    }
	}
	this.repaint();
	this.revalidate();
	
    }

    public void paintComponent(Graphics g) {
	super.paintComponent(g);
	final Image backgroundImage = _backgroundimage;
	double scaleX = getWidth() / (double) backgroundImage.getWidth(null);
	double scaleY = getHeight() / (double) backgroundImage.getHeight(null);
	AffineTransform xform = AffineTransform
		.getScaleInstance(scaleX, scaleY);
	((Graphics2D) g).drawImage(backgroundImage, xform, this);
    }

}
