package com.iambookmaster.client.iphone;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.iambookmaster.client.beans.Alchemy;
import com.iambookmaster.client.beans.Parameter;
import com.iambookmaster.client.iphone.common.ClickHandlerPair;
import com.iambookmaster.client.iphone.common.IPhoneButton;
import com.iambookmaster.client.iphone.images.IPhoneImages;
import com.iambookmaster.client.iphone.images.IPhoneStyles;
import com.iambookmaster.client.locale.AppConstants;
import com.iambookmaster.client.locale.AppLocale;
import com.iambookmaster.client.locale.AppMessages;
import com.iambookmaster.client.player.BattleListener;
import com.iambookmaster.client.player.BattleListenerAdapter;
import com.iambookmaster.client.player.PlayerState;
import com.iambookmaster.client.player.PlayerState.FighterData;
public class IPhoneBattlePanel {
private static final AppConstants appConstants = AppLocale.getAppConstants();
private static final AppMessages appMessages = AppLocale.getAppMessages();
private static IPhoneStyles css = IPhoneImages.INSTANCE.css();
private PlayerState playerState;
private BattleListener playerListener;
private HeroWidget heroWidget;
// private FighterData target;
// private ArrayList<NPCWidget> npcs;
private ClickHandler atackHandler;
private ArrayList<ClickHandlerPair> handlers;
private IPhoneBattlePanelListner listener;
private ArrayList<String> messages;
public IPhoneBattlePanel(PlayerState ps, IPhoneBattlePanelListner lst) {
this.listener = lst;
this.playerState = ps;
messages = new ArrayList<String>();
playerListener = new BattleListenerAdapter(appConstants,appMessages,playerState) {
@Override
protected void addMessage(String message) {
if (playerState.getModel().getSettings().isShowBattleConsole()) {
messages.add(message);
}
}
};
atackHandler = new ClickHandler() {
public void onClick(ClickEvent event) {
attack();
}
};
// target = selectTarget();
handlers = new ArrayList<ClickHandlerPair>();
}
public Widget createBattleWidget(boolean active) {
FlowPanel canvas = new FlowPanel();
handlers.clear();
Label label = new Label(playerState.getCurrentBattle().getName());
label.setStyleName(css.battleTitle());
canvas.add(label);
if (active && playerState.getFighters().size()>1) {
label = new Label(appConstants.iphoneButtleInstructions());
canvas.add(label);
}
//add Hero
heroWidget = new HeroWidget();
canvas.add(heroWidget);
//add enemies
for (FighterData npc : playerState.getFighters()) {
NPCWidget widget = new NPCWidget(npc,active);
canvas.add(widget);
handlers.add(new ClickHandlerPair(widget, widget));
}
if (active) {
if (playerState.isFinished()==false) {
IPhoneButton button = new IPhoneButton(appConstants.playerButtonAttack(),atackHandler);
// if (listener.isVertical() == false) {
// label.getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
// }
// label.setStyleName(css.stateSelection());
// label.addClickHandler(atackHandler);
canvas.add(button);
handlers.add(new ClickHandlerPair(atackHandler,button));
// if (battle.isOneTurnBattle()==false) {
// auto = new Button(appConstants.playerButtonAutoBattle(),mainClickHandler);
// auto.setTitle(appConstants.playerButtonAutoBattleTitle());
// canvas.add(auto);
// canvas.addClickHandler(auto, mainClickHandler);
// }
//all applicable alchemy
ArrayList<Alchemy> list = playerState.getAlchemy(true,true);
if (list != null) {
for (Alchemy alchemy : list) {
AlchemyLink link = new AlchemyLink(alchemy);
canvas.add(link);
handlers.add(new ClickHandlerPair(link, link));
if (alchemy.getBattleLimit() == null) {
if (alchemy.getFromValue()>0) {
heroWidget.addParameter(alchemy.getFrom(), playerState.getParameters().get(alchemy.getFrom()),playerState.getParameters());
}
} else {
heroWidget.addParameter(alchemy.getBattleLimit(), playerState.getHeroBatleLimits().get(alchemy.getBattleLimit()),playerState.getParameters());
}
}
}
}
}
for (String message : messages) {
label = new HTML(message);
label.setStyleName(css.battleMessage());
canvas.add(label);
}
return canvas;
}
public void addListeners(IPhoneCanvas canvas) {
for (ClickHandlerPair pair : handlers) {
canvas.addClickHandler(pair.getWidget(), pair.getHandler());
}
}
public class AlchemyLink extends IPhoneButton implements ClickHandler{
private Alchemy alchemy;
public AlchemyLink(Alchemy alchemy) {
super(alchemy.getName());
// setStyleName(css.stateSelection());
// if (listener.isVertical()==false) {
// getElement().getStyle().setDisplay(Display.INLINE_BLOCK);
// }
this.alchemy = alchemy;
// setText(alchemy.getName());
addClickHandler(this);
}
public void onClick(ClickEvent event) {
messages.clear();
if (playerState.doAlchemyInBattle(alchemy)) {
listener.redraw(true);
}
}
}
public class NPCWidget extends FlowPanel implements ClickHandler{
private Label name;
private FighterData data;
public NPCWidget(FighterData data, boolean active) {
this.data = data;
name = new Label(data.getNpc().getNpc().getName());
if (data.isAlive()) {
name.setStyleName(css.battleNpcName());
} else {
name.setStyleName(css.battleFighterDead());
}
add(name);
if (data.isAlive()) {
if (data.isFriend()) {
setStyleName(css.battleFriendWidget());
} else if (playerState.getFighters().size()<2 || !active) {
setStyleName(css.battleFighterWidget());
} else if (playerState.isTarget(data)) {
setStyleName(css.battleFighterWidgetSelected());
} else if (data.isCanBeTarget()){
sinkEvents(Event.ONCLICK);
setStyleName(css.battleFighterWidgetUnselected());
name.addStyleName(css.battleNpcNameUnselected());
} else {
//non-selectable
setStyleName(css.battleFighterWidgetNonAvalalble());
}
} else {
setStyleName(css.battleFighterWidget());
// setStyleName(css.battleFighterWidgetDead());
}
for (Parameter parameter : data.getParameters().keySet()) {
int value = data.getParameters().get(parameter);
Label label = new Label(parameter.getName());
label.setStyleName(css.battleNpcParameterName());
add(label);
add(new ParameterWidget(parameter,value,null));
}
}
@Override
public void onBrowserEvent(Event event) {
onClick(null);
}
public void onClick(ClickEvent event) {
if (data.isCanBeTarget()) {
playerState.selectTarget(data);
listener.redraw(false);
}
}
}
public class HeroWidget extends FlowPanel {
private Label name;
private HashSet<Parameter> used;
public void updateParameters() {
for (int i = 0; i < this.getWidgetCount(); i++) {
Widget widget = this.getWidget(i);
if (widget instanceof ParameterWidget) {
ParameterWidget parameterWidget = (ParameterWidget) widget;
parameterWidget.apply(playerState.getParameters().get(parameterWidget.parameter),playerState.getParameters());
}
}
}
public HeroWidget() {
used = new HashSet<Parameter>(playerState.getParameters().size());
name = new Label(appConstants.playerBattleHero());
setStyleName(css.battleFighterWidget());
if (playerState.isHeroAlive()) {
if (playerState.isHeroFighting()) {
name.setStyleName(css.battleNpcName());
} else {
name.setStyleName(css.battleHeroInactive());
}
} else {
name.setStyleName(css.battleFighterDead());
}
add(name);
for (Parameter parameter : playerState.getParameters().keySet()) {
//add parameter to the list
if (playerState.getCurrentBattle().dependsOn(parameter)) {
addParameter(parameter,playerState.getParameters().get(parameter),playerState.getParameters());
}
}
}
public void addParameter(Parameter parameter, int value, Map<Parameter,Integer> params) {
if (used.contains(parameter) || parameter.isInvisible()) {
//already used or invisible
return;
}
Label label = new Label(parameter.getName());
label.setStyleName(css.battleNpcParameterName());
add(label);
add(new ParameterWidget(parameter,value,params));
}
}
public class ParameterWidget extends Label{
private Parameter parameter;
public ParameterWidget(Parameter parameter, int value, Map<Parameter, Integer> params) {
setStyleName(css.battleNpcParameterValue());
this.parameter = parameter;
apply(value,params);
}
public void apply(int val, Map<Parameter, Integer> params) {
if (parameter.getLimit()==null || params==null) {
//no limit
setText(String.valueOf(val));
} else {
//update value/limit
setText(String.valueOf(val)+"/"+params.get(parameter.getLimit()));
}
}
}
public void attack() {
messages.clear();
playerState.nextBattleRound(playerListener);
listener.redraw(true);
}
}