package com.ht.ui.taginfo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.javafxdata.control.cell.TextFieldCellFactory;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.util.Callback;

import com.ht.tags.model.tag.TagVar;
import com.ht.ui.energy.util.EnergyConverterUtil;
import com.ht.ui.property.SimpleBeanStringProperty;

class TagVarTableView extends TableView<TagVar> {

	private TableColumn<TagVar, String> rateCol;
	private TableColumn<TagVar, String> valueCol;
	private TableColumn<TagVar, String> acquisitionCol;

	private ObservableList<TagVar> tagVarTableDataList = FXCollections.observableArrayList();
	private Map<TagVar, StringProperty> valuePropertyMap = new HashMap<TagVar, StringProperty>();
	
	public TagVarTableView() {
		super();
		setEditable(true);
		setMaxHeight(Double.MAX_VALUE);
		getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
		setItems(tagVarTableDataList);
		
		TableColumn<TagVar, String> nodeCol = createTagVarTableColumn("支路名称",
				"indexNode", 150);
		TableColumn<TagVar, String> nameCol = createTagVarTableColumn("变量名称",
				"name", 100);
		// TableColumn<TagVarProperty, String> typeCol =
		// createTagVarTableColumn("类型", "type", 80);
		TableColumn<TagVar, String> varIdCol = createTagVarTableColumn("变量编号",
				"varId", 100);
		valueCol = createTagVarTableColumn("耗电量/kWh", "value", 100);
		valueCol.setEditable(true);
//		valueCol.setCellFactory(new Callback<TableColumn<TagVar, String>, TableCell<TagVar, String>>() {
//			@Override
//			public TableCell<TagVar, String> call(
//					TableColumn<TagVar, String> param) {
//				return new EditingCell();
//			}
//		});
		valueCol.setCellFactory(TextFieldCellFactory.<TagVar>forTableColumn());

		rateCol = createTagVarTableColumn("额定功率/kW", "ratedPower", 100);
		acquisitionCol = createTagVarTableColumn("采集方式", "acquisition", 80);
		TableColumn<TagVar, String> energyIndexCol = createTagVarTableColumn(
				"能耗分项", "energyIndex", 120);
		TableColumn<TagVar, String> normalIndexCol = createTagVarTableColumn(
				"常规分类", "normalIndex", 300);

		// tagVarTableView = new TableView<TagVarProperty>();
		// tagVarTableView.setRowFactory(new Callback<TableView<TagVarProperty>,
		// TableRow<TagVarProperty>>() {
		//
		// @Override
		// public TableRow<TagVarProperty> call(TableView<TagVarProperty> param)
		// {
		// return new TableRow<TagVarProperty>() {
		// @Override
		// protected void updateItem(TagVarProperty item, boolean empty) {
		// super.updateItem(item, empty);
		// if (!empty) {
		// //System.out.println(item.getTagVar().getEnergyIndex());
		// if (item.getTagVar().getIndexNode().isEmpty()) {// 总表
		// setStyle("-fx-font-weight: bold;");
		// }
		// }
		// }
		// };
		// }
		// });

		// tagVarTableView.getSelectionModel().setCellSelectionEnabled(true);
		getColumns().addAll(nodeCol, nameCol, varIdCol,
				valueCol, rateCol, acquisitionCol, energyIndexCol,
				normalIndexCol);

	}
	
	private TableColumn<TagVar, String> createTagVarTableColumn(
			String colTitle, final String propertyName, double width) {
		TableColumn<TagVar, String> col = new TableColumn<TagVar, String>(
				colTitle);
		col.setPrefWidth(width);
		col.setSortable(false);
		col.setEditable(false);
		// col.setCellValueFactory(new PropertyValueFactory<TagVar, String>(
		// propertyName));
		col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<TagVar, String>, ObservableValue<String>>() {

			@Override
			public ObservableValue<String> call(
					CellDataFeatures<TagVar, String> param) {
				if (propertyName.equals("acquisition")) {
					return new SimpleStringProperty(
							param.getValue().isManual() ? "人工采集" : "自动采集");
				} else if (propertyName.equals("value")) {
					StringProperty p = valuePropertyMap.get(param.getValue());
					if (p == null) {
						p = new SimpleStringProperty("");
						valuePropertyMap.put(param.getValue(), p);
					}

					return p;

				} else if (propertyName.equals("energyIndex")) {

					String energyName = param.getValue().getEnergyIndex();
					return new SimpleStringProperty(energyName
							.substring(energyName.lastIndexOf('/') + 1));
				} else {

					return new SimpleBeanStringProperty(param.getValue(),
							propertyName);
				}
			}

			@Override
			protected void finalize() throws Throwable {
				super.finalize();
				System.out.println("====");
			}
		});

		return col;
	}
	
	Double getTagVarValue(TagVar var) {
		String  v = valuePropertyMap.get(var).getValue();
		if (v != null && !v.isEmpty()) {
			try {
				return Double.parseDouble(v);
			} catch (NumberFormatException e) {
				e.printStackTrace();
			}
		}
		return null;
	}
	
	void setTagVarValue(TagVar var, String value) {
		valuePropertyMap.get(var).setValue(value);
	}
	
	void setAllTagVarItems(List<TagVar> items) {
		valuePropertyMap.clear();
		if (!items.isEmpty()) {
			TagVar tagVar = items.get(0);
			rateCol.setVisible(tagVar.getEnergyIndex().startsWith("电"));
			valueCol.setText("能耗量/"
					+ EnergyConverterUtil.getEnergyUnit(tagVar
							.getEnergyIndex()));
		}
		
		getItems().addAll(items);
	}
	
	class TagVarNameCell extends TableCell<TagVar, String> {

		private TextField textField;

		public TagVarNameCell() {
		}

		@Override
		public void startEdit() {
			super.startEdit();
			if (isEmpty()) {
				return;
			}

			if (textField == null) {
				createTextField();
			} else {
				textField.setText(getItem());
			}
			setGraphic(textField);
			setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
		}

		@Override
		public void cancelEdit() {
			super.cancelEdit();
			setContentDisplay(ContentDisplay.TEXT_ONLY);
		}

		@Override
		public void updateItem(String item, boolean empty) {
			super.updateItem(item, empty);
			if (!isEmpty()) {
				if (textField != null) {
					textField.setText(item);
				}
				setText(item);
			}
		}

		private void createTextField() {
			textField = new TextField(getItem());
			textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()
					* 2);
			textField.setOnAction(new EventHandler<ActionEvent>() {
				public void handle(ActionEvent event) {
					commitEdit(textField.getText());
				};
			});
		}
	}
}
