package fr.lyrgard.hexScape.gui.desktop.view.game.leftPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import org.apache.commons.lang.StringUtils;
import com.google.common.eventbus.Subscribe;
import fr.lyrgard.hexScape.bus.GuiMessageBus;
import fr.lyrgard.hexScape.gui.desktop.action.AddPieceAction;
import fr.lyrgard.hexScape.gui.desktop.message.CardSelectedMessage;
import fr.lyrgard.hexScape.message.GameLeftMessage;
import fr.lyrgard.hexScape.message.MarkerPlacedMessage;
import fr.lyrgard.hexScape.message.MarkerRemovedMessage;
import fr.lyrgard.hexScape.message.MarkerRevealedMessage;
import fr.lyrgard.hexScape.message.PiecePlacedMessage;
import fr.lyrgard.hexScape.message.PieceRemovedMessage;
import fr.lyrgard.hexScape.model.CurrentUserInfo;
import fr.lyrgard.hexScape.model.card.CardInstance;
import fr.lyrgard.hexScape.model.card.CardType;
import fr.lyrgard.hexScape.model.game.Game;
import fr.lyrgard.hexScape.model.marker.HiddenMarkerInstance;
import fr.lyrgard.hexScape.model.marker.MarkerDefinition;
import fr.lyrgard.hexScape.model.marker.MarkerInstance;
import fr.lyrgard.hexScape.model.marker.StackableMarkerInstance;
import fr.lyrgard.hexScape.model.piece.PieceInstance;
import fr.lyrgard.hexScape.model.player.User;
import fr.lyrgard.hexScape.service.CardService;
import fr.lyrgard.hexScape.service.MarkerService;
public class ArmyCardPanel extends JPanel {
private static final long serialVersionUID = 6580633451061376631L;
private CardInstance card;
private ImageIcon imageIcon;
private int piecesNumber = 0;
private JLabel figureNumbersLabel;
private JButton addFigureButton;
private JPanel markerPanel;
public ArmyCardPanel(final CardInstance card, String playerId) {
User user = CurrentUserInfo.getInstance();
this.card = card;
setLayout(new BorderLayout());
markerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 1, 1));
add(markerPanel, BorderLayout.CENTER);
CardType cardType = CardService.getInstance().getCardInventory().getCardsById().get(card.getCardTypeId());
imageIcon = new ImageIcon(new File(cardType.getIconPath()).getAbsolutePath());
piecesNumber = card.getNumber() * cardType.getFigureNames().size();
card.getPieceLeftToPlace().clear();
List<String> pieceLeft = new ArrayList<>();
for (int i = 0; i < card.getNumber(); i++ ) {
for (String figureName : cardType.getFigureNames()) {
pieceLeft.add(figureName);
}
}
// Remove already placed pieces
for (PieceInstance piece :card.getPieces()) {
pieceLeft.remove(piece.getModelId());
}
card.getPieceLeftToPlace().addAll(pieceLeft);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
add(buttonPanel, BorderLayout.PAGE_END);
figureNumbersLabel = new JLabel();
addFigureButton = new JButton();
selectNextPiece();
if (user.isPlayingGame()) {
addFigureButton.setAlignmentX(24);
buttonPanel.add(addFigureButton);
if (card.getPieceLeftToPlace().size() == 0) {
addFigureButton.setEnabled(false);
}
}
buttonPanel.add(figureNumbersLabel);
JLabel imageLabel = new JLabel(imageIcon);
add(imageLabel, BorderLayout.LINE_END);
if (user.isPlayingGame() && user.getPlayerId().equals(playerId)) {
imageLabel.addMouseListener(new PopMenuClickListener(new ArmyCardMenu(card)));
}
imageLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
GuiMessageBus.post(new CardSelectedMessage(card));
}
}
});
Border border = BorderFactory.createLineBorder(Color.BLACK, 2, true);
border = BorderFactory.createTitledBorder(border, cardType.getName(), TitledBorder.LEFT, TitledBorder.TOP);
setBorder(border);
setSize(180, 125);
setMaximumSize(new Dimension(175, 125));
setPreferredSize(new Dimension(175, 125));
reDrawMarkers();
GuiMessageBus.register(this);
}
private void selectNextPiece() {
figureNumbersLabel.setText(card.getPieceLeftToPlace().size() + "/" + piecesNumber);
addFigureButton.setAction(new AddPieceAction(card.getPieceLeftToPlace().peek(), card));
addFigureButton.setText("");
}
@Subscribe public void onPiecePlaced(final PiecePlacedMessage message) {
EventQueue.invokeLater(new Runnable() {
public void run() {
String playerId = message.getPlayerId();
String cardId = message.getCardInstanceId();
Game game = CurrentUserInfo.getInstance().getGame();
if (game != null) {
if (card.getId().equals(cardId)) {
card.getPieceLeftToPlace().poll();
selectNextPiece();
if (card.getPieceLeftToPlace().size() == 0) {
addFigureButton.setEnabled(false);
} else if (StringUtils.equals(playerId, CurrentUserInfo.getInstance().getPlayerId())) {
addFigureButton.getAction().actionPerformed(null);
}
}
}
}
});
}
@Subscribe public void onPieceRemoved(final PieceRemovedMessage message) {
EventQueue.invokeLater(new Runnable() {
public void run() {
String pieceId = message.getPieceId();
PieceInstance piece = card.getPiece(pieceId);
if (piece != null) {
if (piece != null && piece.getCard() != null) {
String cardId = piece.getCard().getId();
if (card.getId().equals(cardId)) {
card.getPieceLeftToPlace().add(piece.getModelId());
if (card.getPieceLeftToPlace().size() == 1) {
addFigureButton.setEnabled(true);
}
selectNextPiece();
}
}
}
}
});
}
private void reDrawMarkers() {
markerPanel.removeAll();
for (MarkerInstance marker : card.getMarkers()) {
ImageIcon markerIcon = null;
final JLabel imageLabel = new JLabel();
MarkerDefinition markerDefinition = MarkerService.getInstance().getMarkersByIds().get(marker.getMarkerDefinitionId());
switch (markerDefinition.getType()) {
case NORMAL:
markerIcon = new ImageIcon(markerDefinition.getImage().getAbsolutePath());
break;
case STACKABLE:
markerIcon = new ImageIcon(markerDefinition.getImage().getAbsolutePath());
int number = ((StackableMarkerInstance)marker).getNumber();
String numberString = Integer.toString(number);
imageLabel.setText(numberString);
imageLabel.setIconTextGap(1);
break;
case REVEALABLE:
markerIcon = new ImageIcon(markerDefinition.getImage().getAbsolutePath());
break;
case HIDDEN:
markerIcon = new ImageIcon(markerDefinition.getImage().getAbsolutePath());
String hiddenMarkerTypeId = ((HiddenMarkerInstance)marker).getHiddenMarkerDefinitionId();
if (StringUtils.isNotEmpty(hiddenMarkerTypeId)) {
MarkerDefinition hiddenMarkerDefinition = MarkerService.getInstance().getMarkersByIds().get(hiddenMarkerTypeId);
final ImageIcon hiddenMarkerIcon = new ImageIcon(hiddenMarkerDefinition.getImage().getAbsolutePath());
final ImageIcon normalMarkerIcon = markerIcon;
imageLabel.addMouseListener(new PopMenuClickListener(new RevealableMarkerMenu(card, (HiddenMarkerInstance)marker)));
imageLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(java.awt.event.MouseEvent evt) {
imageLabel.setIcon(hiddenMarkerIcon);
}
@Override
public void mouseExited(java.awt.event.MouseEvent evt) {
imageLabel.setIcon(normalMarkerIcon);
}
});
}
break;
}
imageLabel.setIcon(markerIcon);
markerPanel.add(imageLabel);
}
markerPanel.validate();
markerPanel.repaint();
}
@Subscribe public void onMarkerPlaced(final MarkerPlacedMessage message) {
EventQueue.invokeLater(new Runnable() {
public void run() {
String cardId = message.getCardId();
if (ArmyCardPanel.this.card.getId().equals(cardId)) {
reDrawMarkers();
}
}
});
}
@Subscribe public void onMarkerRemoved(final MarkerRemovedMessage message) {
EventQueue.invokeLater(new Runnable() {
public void run() {
String cardId = message.getCardId();
if (ArmyCardPanel.this.card.getId().equals(cardId)) {
reDrawMarkers();
}
}
});
}
@Subscribe public void onMarkerRevealed(final MarkerRevealedMessage message) {
EventQueue.invokeLater(new Runnable() {
public void run() {
String cardId = message.getCardId();
if (ArmyCardPanel.this.card.getId().equals(cardId)) {
reDrawMarkers();
}
}
});
}
@Subscribe public void onGameLeft(GameLeftMessage message) {
String playerId = message.getPlayerId();
if (StringUtils.equals(playerId, CurrentUserInfo.getInstance().getPlayerId())) {
GuiMessageBus.unregister(this);
}
}
}