package com.infoteria.asteria.sample.plugin;

import com.infoteria.asteria.flowbuilder2.sqlbuilder.NullTableProvider;
import com.infoteria.asteria.flowbuilder2.sqlbuilder.TableSelectDialog;
import com.infoteria.asteria.flowbuilder2.plugin.SQLTool;
import com.infoteria.asteria.flowbuilder2.plugin.PluginUtil;
import com.infoteria.asteria.flowbuilder2.component.ComponentInputConnector;
import com.infoteria.asteria.flowbuilder2.component.Component;
import com.infoteria.asteria.flowbuilder2.property.category.CategoryItem;
import com.infoteria.asteria.flowbuilder2.property.category.CategoryProperty;
import com.infoteria.asteria.flowbuilder2.event.BaseObjectUndoableEvent ;
import com.infoteria.asteria.flowbuilder2.plugin.ComponentEditor;
import com.infoteria.asteria.sqlbuilder.model.Table;
import com.infoteria.asteria.sqlbuilder.model.TableProvider;
import com.infoteria.gui.property.Property;
import com.infoteria.asteria.flowbuilder2.stream.field.FieldDefinition;
import com.infoteria.gui.property.Property;
import com.infoteria.gui.property.PropertyException;
import java.io.IOException;
import java.util.List;
import javax.swing.undo.UndoableEdit;

public class TableSelectSample extends ComponentEditor {
	
	private static final String FIELD_PROP = "Field(Input)";
	private static final String CONNECTION_PROP = "Connection";
	private static final String TABLE_PROP = "TableName";
	
	protected void doAction(BaseObjectUndoableEvent e , boolean bEditable) {
		Component c = (Component)e.getBaseObject();
		
		Property connectionProp = c.getProperty(CONNECTION_PROP);
		Property tableNameProp = c.getProperty(TABLE_PROP) ;
		CategoryProperty fieldProp = (CategoryProperty)c.getAdditionalProperty(FIELD_PROP);
		
		if (connectionProp == null || fieldProp == null || tableNameProp == null)
			return;
		
		String orgTableName = tableNameProp.getValueAsString();
		
		SQLTool tool = PluginUtil.getSQLTool();
		try {
			TableProvider provider = tool.getTableProvider(connectionProp.getValueAsString());
			if (provider == null)
				provider = new NullTableProvider();
			
			TableSelectDialog dlg = SQLTool.createTableSelectDialog("Select table", provider);
			try {
				//テーブル名と列名をダイアログに設定
				if (orgTableName != null && orgTableName.length() > 0)
					dlg.setup(orgTableName, getFieldNames(fieldProp));
				
				dlg.setVisible(true);
				if (bEditable && dlg.isOK()) {
					//Table情報の取得
					//ここで取得されるTableには選択された列のみが含まれている
					Table table = dlg.getSelectedTable();
					if (table == null)
						return;
					
					//「スキーマを付加する」のチェックを考慮したテーブル名
					String newTableName = dlg.getTableNameForProperty(table);
					
					e.addUndo(SQLTool.updateCategoryProperty(fieldProp, table));
					e.addUndo(tableNameProp.setValue(newTableName));
					//入力コネクタからFieldDefinitionを取得
					ComponentInputConnector con = (ComponentInputConnector)c.getDefaultInputConnector();
					if (con.getStreamDefinition() != null) {
						FieldDefinition fd = con.getStreamDefinition().getFieldDefinition();
						e.addUndo(SQLTool.updateFieldDefinition(fd, table));
					}
				}
			} finally {
				dlg.dispose();
			}
		} catch ( PropertyException ex ) {
			//not occure
			ex.printStackTrace() ;
		} catch (IOException ex) {
			PluginUtil.showError(ex.getMessage());
		}
	}
	
	/**
	 * CategoryPropertyに設定されているフィールド名を配列で取得します。
	 */
	private String[] getFieldNames(CategoryProperty prop) {
		List list = prop.getItemList();
		String[] ret = new String[list.size()];
		for (int i=0; i<list.size(); i++) {
			CategoryItem item = (CategoryItem)list.get(i);
			ret[i] = (String)item.getValue("Name");
		}
		return ret;
	}
	
}
