package org.moparscape.msc.gs.npchandler;

import org.moparscape.msc.gs.Instance;
import org.moparscape.msc.gs.event.ShortEvent;
import org.moparscape.msc.gs.external.CerterDef;
import org.moparscape.msc.gs.external.EntityHandler;
import org.moparscape.msc.gs.model.ChatMessage;
import org.moparscape.msc.gs.model.InvItem;
import org.moparscape.msc.gs.model.MenuHandler;
import org.moparscape.msc.gs.model.Npc;
import org.moparscape.msc.gs.model.Player;
import org.moparscape.msc.gs.model.World;

public class Certer implements NpcHandler {
    /**
     * World instance
     */
    public static final World world = Instance.getWorld();

    public void handleNpc(final Npc npc, Player player) throws Exception {
	final CerterDef certerDef = EntityHandler.getCerterDef(npc.getID());
	if (certerDef == null) {
	    return;
	}
	final String[] names = certerDef.getCertNames();
	player.informOfNpcMessage(new ChatMessage(npc, "Welcome to my " + certerDef.getType() + " exchange stall", player));
	player.setBusy(true);
	Instance.getDelayedEventHandler().add(new ShortEvent(player) {
	    public void action() {
		owner.setBusy(false);
		String[] options = new String[] { "I have some certificates to trade in", "I have some " + certerDef.getType() + " to trade in" };
		owner.setMenuHandler(new MenuHandler(options) {
		    public void handleReply(final int option, final String reply) {
			if (owner.isBusy()) {
			    return;
			}
			owner.informOfChatMessage(new ChatMessage(owner, reply, npc));
			owner.setBusy(true);
			Instance.getDelayedEventHandler().add(new ShortEvent(owner) {
			    public void action() {
				owner.setBusy(false);
				switch (option) {
				case 0:
				    owner.getActionSender().sendMessage("What sort of certificate do you wish to trade in?");
				    owner.setMenuHandler(new MenuHandler(names) {
					public void handleReply(final int index, String reply) {
					    owner.getActionSender().sendMessage("How many certificates do you wish to trade in?");
					    String[] options = new String[] { "One", "Two", "Three", "Four", "Five", "All to bank" };
					    owner.setMenuHandler(new MenuHandler(options) {
						public void handleReply(int certAmount, String reply) {
						    owner.resetPath();
						    int certID = certerDef.getCertID(index);
						    if (certID < 0) { // This
							// shouldn't
							// happen
							return;
						    }
						    int itemID = certerDef.getItemID(index);
						    if (certAmount == 5) {
							certAmount = owner.getInventory().countId(certID);
							if (certAmount <= 0) {
							    owner.getActionSender().sendMessage("You don't have any " + names[index] + " certificates");
							    return;
							}
							// MIGHT
							// BE
							// SMART
							// TO
							// CHECK
							// THEIR
							// BANK
							// ISN'T
							// FULL
							InvItem bankItem = new InvItem(itemID, certAmount * 5);
							if (owner.getInventory().remove(new InvItem(certID, certAmount)) > -1) {
							    owner.getActionSender().sendMessage("You exchange the certificates, " + bankItem.getAmount() + " " + bankItem.getDef().getName() + " is added to your bank");
							    owner.getBank().add(bankItem);
							}
						    } else {
							certAmount += 1;
							int itemAmount = certAmount * 5;
							if (owner.getInventory().countId(certID) < certAmount) {
							    owner.getActionSender().sendMessage("You don't have that many certificates");
							    return;
							}
							if (owner.getInventory().remove(certID, certAmount) > -1) {
							    owner.getActionSender().sendMessage("You exchange the certificates for " + certerDef.getType() + ".");
							    for (int x = 0; x < itemAmount; x++) {
								owner.getInventory().add(new InvItem(itemID, 1));
							    }
							}
						    }
						    owner.getActionSender().sendInventory();
						}
					    });
					    owner.getActionSender().sendMenu(options);
					}
				    });
				    owner.getActionSender().sendMenu(names);
				    break;
				case 1:
				    owner.getActionSender().sendMessage("What sort of " + certerDef.getType() + " do you wish to trade in?");
				    owner.setMenuHandler(new MenuHandler(names) {
					public void handleReply(final int index, String reply) {
					    owner.getActionSender().sendMessage("How many " + certerDef.getType() + " do you wish to trade in?");
					    String[] options = new String[] { "Five", "Ten", "Fifteen", "Twenty", "Twentyfive", "All from bank" };
					    owner.setMenuHandler(new MenuHandler(options) {
						public void handleReply(int certAmount, String reply) {
						    owner.resetPath();
						    int certID = certerDef.getCertID(index);
						    if (certID < 0) { // This
							// shouldn't
							// happen
							return;
						    }
						    int itemID = certerDef.getItemID(index);
						    if (certAmount == 5) {
							certAmount = (int) (owner.getBank().countId(itemID) / 5);
							int itemAmount = certAmount * 5;
							if (itemAmount <= 0) {
							    owner.getActionSender().sendMessage("You don't have any " + names[index] + " to cert");
							    return;
							}
							if (owner.getBank().remove(itemID, itemAmount) > -1) {
							    owner.getActionSender().sendMessage("You exchange the " + certerDef.getType() + ", " + itemAmount + " " + EntityHandler.getItemDef(itemID).getName() + " is taken from your bank");
							    owner.getInventory().add(new InvItem(certID, certAmount));
							}
						    } else {
							certAmount += 1;
							int itemAmount = certAmount * 5;
							if (owner.getInventory().countId(itemID) < itemAmount) {
							    owner.getActionSender().sendMessage("You don't have that many " + certerDef.getType());
							    return;
							}
							owner.getActionSender().sendMessage("You exchange the " + certerDef.getType() + " for certificates.");
							for (int x = 0; x < itemAmount; x++) {
							    owner.getInventory().remove(itemID, 1);
							}
							owner.getInventory().add(new InvItem(certID, certAmount));
						    }
						    owner.getActionSender().sendInventory();
						}
					    });
					    owner.getActionSender().sendMenu(options);
					}
				    });
				    owner.getActionSender().sendMenu(names);
				    break;
				}
				npc.unblock();
			    }
			});
		    }
		});
		owner.getActionSender().sendMenu(options);
	    }
	});
	npc.blockedBy(player);
    }

}