package magic.ui.screen.duel.mulligan;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import magic.data.GeneralConfig;
import magic.data.MagicIcon;
import magic.model.MagicCardList;
import magic.translate.MText;
import magic.ui.ScreenController;
import magic.ui.WikiPage;
import magic.ui.helpers.KeyEventAction;
import magic.ui.screen.HeaderFooterScreen;
import magic.ui.screen.MScreen;
import magic.ui.screen.HandZoneLayout;
import magic.ui.screen.widget.MenuButton;
import magic.ui.widget.cards.canvas.CardsCanvas;
import magic.ui.widget.cards.canvas.CardsCanvas.LayoutMode;
import magic.ui.widget.duel.choice.MulliganChoicePanel;
@SuppressWarnings("serial")
public class MulliganScreen extends HeaderFooterScreen {
// translatable string
private static final String _S1 = "Vancouver Mulligan";
private static final String _S2 = "Close";
private static final String _S3 = "Play this hand";
private static final String _S5 = "Returns this hand to your library then draws a new hand with one less card.<br>You may scry 1 if your opening hand has fewer cards than your starting hand size.";
private volatile static boolean isActive = false;
private CardsCanvas cardsCanvas;
private MulliganChoicePanel choicePanel;
private final MagicCardList hand;
private OptionsPanel optionsPanel;
public MulliganScreen(final MulliganChoicePanel choicePanel, final MagicCardList hand) {
super(MText.get(_S1));
this.choicePanel = choicePanel;
this.hand = hand;
isActive = true;
setMainContent(getScreenContent(hand));
optionsPanel = new OptionsPanel(this);
setHeaderContent(new HeaderPanel(choicePanel.getGameController().getGame()));
setHeaderOptions(optionsPanel);
setLeftFooter(MenuButton.build(this::doCancel, MText.get(_S2)));
setRightFooter(MenuButton.build(this::doNextAction, MText.get(_S3)));
addToFooter(MenuButton.build(this::doMulligan,
MagicIcon.MULLIGAN, MText.get(_S1), MText.get(_S5))
);
setWikiPage(WikiPage.MULLIGAN);
KeyEventAction.doAction(this, this::doCancel)
.onFocus(0, KeyEvent.VK_ESCAPE);
}
public static boolean isActive() {
return isActive;
}
private JPanel getScreenContent(final MagicCardList hand) {
cardsCanvas = new CardsCanvas();
setCardsLayout();
cardsCanvas.setAnimationEnabled(true);
cardsCanvas.setAnimationDelay(50, 20);
cardsCanvas.setLayoutMode(LayoutMode.SCALE_TO_FIT);
refreshCardsDisplay(hand);
return cardsCanvas;
}
public void dealNewHand(final MulliganChoicePanel choicePanel, final MagicCardList hand) {
this.choicePanel = choicePanel;
refreshCardsDisplay(hand);
}
private void refreshCardsDisplay(final MagicCardList hand) {
// Important: uses Runnable so painting works properly.
SwingUtilities.invokeLater(() -> {
cardsCanvas.refresh(hand);
});
}
/**
* Close screen and set flag so that it is not re-opened should the
* user subsequently take a mulligan from the main game screen.
*/
private void doCancel() {
if (!cardsCanvas.isBusy()) {
isActive = false;
ScreenController.closeActiveScreen(false);
}
}
private void doNextAction() {
if (!cardsCanvas.isBusy()) {
choicePanel.doMulliganAction(false);
isActive = false;
ScreenController.closeActiveScreen(false);
}
}
private void doMulligan() {
if (!cardsCanvas.isBusy()) {
choicePanel.doMulliganAction(true);
if (hand.size() <= 2) {
isActive = false;
ScreenController.closeActiveScreen(false);
}
}
}
private void setCardsLayout() {
switch (HandZoneLayout.getLayout()) {
case STACKED_DUPLICATES:
cardsCanvas.setStackDuplicateCards(true);
break;
case NO_STACKING:
cardsCanvas.setStackDuplicateCards(false);
break;
default:
throw new IndexOutOfBoundsException();
}
}
void doSwitchLayout() {
HandZoneLayout.setNextLayout();
setCardsLayout();
}
private void doSaveSettings() {
HandZoneLayout.save();
GeneralConfig.getInstance().save();
}
@Override
public boolean isScreenReadyToClose(MScreen nextScreen) {
if (super.isScreenReadyToClose(nextScreen)) {
doSaveSettings();
return true;
}
return false;
}
}