package asandatabasebrowser.action;

import java.awt.event.ActionEvent;
import java.util.ArrayList;

import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

import net.sourceforge.swingx.SxOptionPane;

import asandatabasebrowser.AsanDatabaseBrowser;
import asandatabasebrowser.model.FavoriteGroup;
import asandatabasebrowser.model.FavoriteTable;
import asandatabasebrowser.model.SchemaInfo;
import asandatabasebrowser.model.TableInfo;
import asandatabasebrowser.model.TableTypeInfo;
import asandatabasebrowser.model.VvDatabase;
import asandatabasebrowser.util.SqlGenerator;
import asandatabasebrowser.view.DbTreeView;
import asandatabasebrowser.view.FavoriteTree;


public class CreateDdlAction extends AbstractAction {
	AsanDatabaseBrowser tools;
	
	public CreateDdlAction(AsanDatabaseBrowser tools) {
		super("DDL作成");
		putValue(SHORT_DESCRIPTION,	"選択されたテーブルのDDLを作成します");
		putValue(LONG_DESCRIPTION, "選択されたテーブルのDDLを作成します");
		this.tools = tools;
	}

	public void actionPerformed(ActionEvent ev) {
		// 選択されたTableInfoを集める。
        ArrayList list = new ArrayList();	// ArrayList<TableInfo>
		if (tools.getTreeFrame().tab.getSelectedIndex() == 0) {
	        // Databaseタブのとき、
			DbTreeView tree = tools.getTreeFrame().getTree();
			TreePath[] paths = tree.getSelectionPaths();
			for (int i=0; i<paths.length; i++) {
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) paths[i].getLastPathComponent();
				Object obj = node.getUserObject();
				if (obj instanceof SchemaInfo) {
					SchemaInfo schema = (SchemaInfo) node.getUserObject();
			        for (int j=0; j<schema.getCount(); j++) {
			        	TableTypeInfo type = schema.getTableTypeInfo(j);
			        	for (int t=0; t<type.getCount(); t++) {
			        		if (! list.contains(type.getTableInfo(t)))
			        			list.add(type.getTableInfo(t));
			        	}
			        }
				} else if (obj instanceof TableTypeInfo) {
		        	TableTypeInfo type = (TableTypeInfo) obj;
		        	for (int t=0; t<type.getCount(); t++) {
		        		if (! list.contains(type.getTableInfo(t)))
		        			list.add(type.getTableInfo(t));
		        	}
				} else if (obj instanceof TableInfo) {
	        		if (! list.contains(obj))
	        			list.add(obj);
				}
			}
		} else {
			// お気に入りタブのとき、
			FavoriteTree tree = tools.getTreeFrame().getFavTree();
			Object[] objs = tree.getSelectionNodeObjects();
			if (objs == null) return;
			ArrayList favlist = new ArrayList();
			// FavoriteTableを集める。
			for (int i=0; i<objs.length; i++) {
				if (objs[i] instanceof FavoriteTable) {
					favlist.add(objs[i]);
				}
			}
			// FavoriteTableがなければ、FavoriteGroup内のFavoriteTableを集める。
			if (favlist.size() == 0) {
				for (int i=0; i<objs.length; i++) {
					if (objs[i] instanceof FavoriteGroup) {
						FavoriteGroup fg = (FavoriteGroup) objs[i];
						for (int g=0; g<fg.getCount(); g++) {
							favlist.add(fg.get(g));
						}
					}
				}
			}
			// TableInfoに変換する。
			for (int i=0; i<favlist.size(); i++) {
				FavoriteTable favtable = (FavoriteTable) favlist.get(i);
				VvDatabase db = tools.doc.getDatabaseFromFavorite(favtable);
				if (db == null) {
					tools.showMessage(tools.getTreeFrame(), 
								"指定されたDBが見つかりません。:"+favtable.dbName, null, 
								JOptionPane.ERROR);
					return;
				}
				if (db.getConnection() == null) {
					tools.showMessage(tools.getTreeFrame(), 
							"指定されたDBは接続されていません。:"+favtable.dbName, null, 
							JOptionPane.ERROR);
					return;
				}
				TableInfo t = tools.doc.getTableInfoFromFavorite(favtable);
				list.add(t);
			}
		}

        if (list.size() == 0) {
        	tools.showMessage(tools.getTreeFrame(), "テーブルが選択されていません", null, SxOptionPane.WARNING_MESSAGE);
        	return;
        }
        try { 
	        // 生成する 
			SqlGenerator generator = new SqlGenerator("templateDDL.xml");
			String ddl = generator.generate(list);
			System.out.println("DDL="+ddl);
			tools.openTextFrame("DDL作成", ddl, true);
		}
		catch (Exception e) {
			tools.showMessage(tools.getTreeFrame(), "DDLの作成に失敗しました", e, SxOptionPane.ERROR_MESSAGE);
		}
	}
}

