/**
 * 
 */
package view;

import java.util.HashMap;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.Labeled;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import jefXif.view.WindowController;
import pathfinder.data.Items.Item;
import pathfinder.data.Items.SlotType;
import view.itemViews.ItemView;

/**
 * @author Matthew
 *
 */
public class InventoryPartialController extends WindowController {

	@FXML
	TableView<Item> tableInventory;
	@FXML
	TableColumn<Item, String> colName;
	@FXML
	Label lblWeightValue;
	@FXML
	Label lblHead;
	@FXML
	Label lblTorso;
	@FXML
	Label lblHands;
	@FXML
	Label lblRightRing;
	@FXML
	Label lblLeftRing;
	@FXML
	Label lblWaist;
	@FXML
	Label lblLegs;
	@FXML
	Label lblFeet;
	@FXML
	Label lblWeapon;
	@FXML
	Label lblRangedWeapon;
	@FXML
	Label lblShield;
	
	HashMap<String, ItemSlot> itemSlots;

	ItemView weaponView;
	ItemView armorView;
	ItemView goodsView;
	Item itemToRemove;
	
	public Item getItemToRemove() {
		return this.itemToRemove;
	}
	
	private ObservableList<Item> inventory = FXCollections
			.observableArrayList();
	
	public ObservableList<Item> getInventory() {
		return inventory;
	}
	

	/*
	 * (non-Javadoc)
	 * 
	 * @see jefXif.view.WindowController#initialize()
	 */
	@Override
	public void initialize() {
		// make the list view look at the right list
		tableInventory.setItems(inventory);
		// set the on selection options for the list
		tableInventory
				.getSelectionModel()
				.selectedItemProperty()
				.addListener(
						(observable, oldValue, newValue) -> handleSelectedCharacterItem(newValue));
		colName.setCellValueFactory(cellData->cellData.getValue().Name);
		// deal with each cell of the list
		tableInventory.setRowFactory(tableRow->{
			final TableRow<Item>row = new TableRow<>();
			// store the cells item for easy reference
			Item item = row.getItem();
			// create a context menu for the cell
			ContextMenu itemMenu = new ContextMenu();
			// create the equip option for the menu
			MenuItem equip = new MenuItem("Equip Item");
			equip.setOnAction(new EventHandler<ActionEvent>() {

				@Override
				public void handle(ActionEvent event) {
					String[] classParts = row.getItem().getClass().toString().split("\\.");
					String caseString = classParts[classParts.length-1];
					switch (caseString) {
					case "Weapon":
						if(itemSlots.get(caseString)!=null) {
//							inventory.add(itemSlots.get(caseString).getItem());
							itemSlots.get(caseString).setItem(row.getItem());
							row.getStyleClass().add("equipped");
//							inventory.remove(row.getItem());
						}
						else {
							itemSlots.get(caseString).setItem(row.getItem());
							row.getStyleClass().add("equipped");
						}
						System.out.println(row.getItem().Name.get()+" Successfully added to the Weapon slot");
						break;
					default:
						System.out.println(row.getItem().getClass().toString());
						break;
					}
				}

			});

			itemMenu.getItems().add(equip);
			
			row.setContextMenu(itemMenu);
			return row;
		});
		
		itemSlots = new HashMap<>();
	}
	
	public void setupScreen() {
		itemSlots.put("Head", new ItemSlot(lblHead, SlotType.Head));
		itemSlots.put("Torso", new ItemSlot(lblTorso, SlotType.Torso));
		itemSlots.put("Hands", new ItemSlot(lblHands, SlotType.Hands));
		itemSlots.put("RightRing", new ItemSlot(lblRightRing, SlotType.Ring));
		itemSlots.put("LeftRing", new ItemSlot(lblLeftRing, SlotType.Ring));
		itemSlots.put("Waist", new ItemSlot(lblWaist, SlotType.Waist));
		itemSlots.put("Legs", new ItemSlot(lblLegs, SlotType.Legs));
		itemSlots.put("Feet", new ItemSlot(lblFeet, SlotType.Feet));
		itemSlots.put("Weapon", new ItemSlot(lblWeapon, SlotType.Weapon));
		itemSlots.put("RangedWeapon", new ItemSlot(lblRangedWeapon, SlotType.RangedWeapon));
		itemSlots.put("Shield", new ItemSlot(lblShield, SlotType.Shield));
	}
	
	private void handleSelectedCharacterItem(Item item) {
		itemToRemove = item;
	}


	public Labeled getWeightLabel() {
		return this.lblWeightValue;
	}
	
	@FXML
	private void showHead() {
		armorView.setItem(itemSlots.get("Head").getItem());
		armorView.getDialogStage().setX(0);
		armorView.getDialogStage().setY(0);
		armorView.show();
	}

	@FXML
	private void showTorso() {
		armorView.setItem(itemSlots.get("Torso").getItem());
		armorView.getDialogStage().setX(0);
		armorView.getDialogStage().setY(0);
		armorView.show();
	}

	@FXML
	private void showHands() {
		armorView.setItem(itemSlots.get("Hands").getItem());
		armorView.getDialogStage().setX(0);
		armorView.getDialogStage().setY(0);
		armorView.show();
	}

	@FXML
	private void showRightRing() {
		armorView.setItem(itemSlots.get("RightRing").getItem());
		armorView.getDialogStage().setX(0);
		armorView.getDialogStage().setY(0);
		armorView.show();
	}

	@FXML
	private void showLeftRing() {
		armorView.setItem(itemSlots.get("LeftRing").getItem());
		armorView.getDialogStage().setX(0);
		armorView.getDialogStage().setY(0);
		armorView.show();
	}

	@FXML
	private void showWaist() {
		armorView.setItem(itemSlots.get("Head").getItem());
		armorView.getDialogStage().setX(0);
		armorView.getDialogStage().setY(0);
		armorView.show();
	}

	@FXML
	private void showLegs() {
		armorView.setItem(itemSlots.get("Head").getItem());
		armorView.getDialogStage().setX(0);
		armorView.getDialogStage().setY(0);
		armorView.show();
	}

	@FXML
	private void showFeet() {
		armorView.setItem(itemSlots.get("Head").getItem());
		armorView.getDialogStage().setX(0);
		armorView.getDialogStage().setY(0);
		armorView.show();
	}

	@FXML
	private void showRightWeapon() {
		weaponView.setItem(itemSlots.get("Head").getItem());
		weaponView.getDialogStage().setX(0);
		weaponView.getDialogStage().setY(0);
		weaponView.show();
	}

	@FXML
	private void showLeftWeapon() {
		weaponView.setItem(itemSlots.get("Head").getItem());
		weaponView.getDialogStage().setX(0);
		weaponView.getDialogStage().setY(0);
		weaponView.show();
	}

	@FXML
	private void showRangedWeapon() {
		weaponView.setItem(itemSlots.get("Head").getItem());
		weaponView.getDialogStage().setX(0);
		weaponView.getDialogStage().setY(0);
		weaponView.show();
	}

	@FXML
	private void showShield() {
		armorView.setItem(itemSlots.get("Head").getItem());
		armorView.getDialogStage().setX(0);
		armorView.getDialogStage().setY(0);
		armorView.show();
	}

	public void setWeaponView(ItemView weaponView) {
		this.weaponView = weaponView;
	}

	public void setArmorView(ItemView armorView) {
		this.armorView = armorView;
	}
	
	public void setGoodsView(ItemView goodsView) {
		this.goodsView = goodsView;
	}
}
