#include <CtrlLib/CtrlLib.h>
#include <plugin/sqlite3/Sqlite3.h>
#include <CodeEditor/CodeEditor.h>

using namespace Upp;

struct App: public TopWindow {
	CodeEditor cmd;
	ArrayCtrl result;
	ParentCtrl top;
	Button go;
	Splitter split;
	Sqlite3Session db;
	
	typedef App CLASSNAME;
	
	App(const String& dbfile){
		Title("Sqlite console").Sizeable().Zoomable();
		
		Add(split.SizePos());
		top.Add(cmd.HSizePosZ(0,50).VSizePosZ());
		top.Add(go.RightPosZ(0,50).VSizePosZ());
		split.Vert(top.SizePos(),result.SizePos());
		
		cmd.Highlight(CodeEditor::HIGHLIGHT_SQL);
		cmd.LineNumbers(true);
		
		go <<= THISBACK(Query);
		go.SetLabel("Go");
		
		db.LogErrors(true);
		#ifdef flagDEBUG
		db.SetTrace();
		#endif
		if(!db.Open(dbfile)){
			Exclamation("Can't create or open database file");
			return;
		}
		SQL = db;
	}
	void Query(){
		result.Reset();
		String s=~cmd;
		s.Replace("\n"," ");
		if(!SQL.Execute(s)){
			Exclamation(DeQtf(SQL.GetLastError()));
			return;
		}
		int n = SQL.GetColumns();
		for(int i=0;i<n;i++)
			result.AddColumn(SQL.GetColumnInfo(i).name);
		
		while(SQL.Fetch())
			result.Add(SQL.GetRow());
	}
};

GUI_APP_MAIN
{
	const Vector<String>& args = CommandLine();
	String db;
	if(args.GetCount()==0){
		db = GetHomeDirFile("sqltest.db");
		LOG("No database file given, using default: "<<db);
	} else {
		db = args[0];
	}
	App(db).Run();
}
