//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// pgTrigger.h PostgreSQL Trigger
//
//////////////////////////////////////////////////////////////////////////

#ifndef PGTRIGGER_H
#define PGTRIGGER_H

#include "pgTable.h"

class pgFunction;

class pgTriggerObject : public pgSchemaObject
{
public:
	pgTriggerObject(pgSchema *newSchema, pgaFactory &factory, const wxString &newName = wxEmptyString) : pgSchemaObject(newSchema, factory, newName) {}

	wxString GetFormattedDefinition();
	wxString GetDefinition() const
	{
		return definition;
	}
	void iSetDefinition(const wxString &s)
	{
		definition = s;
	}

protected:
	wxString definition;
};



class pgTriggerFactory : public pgSchemaObjFactory
{
public:
	pgTriggerFactory();
	virtual dlgProperty *CreateDialog(frmMain *frame, pgObject *node, pgObject *parent);
	virtual pgObject *CreateObjects(pgCollection *obj, ctlTree *browser, const wxString &restr = wxEmptyString);
	virtual pgCollection *CreateCollection(pgObject *obj);

	int GetClosedIconId()
	{
		return closedId;
	}

protected:
	int closedId;
};
extern pgTriggerFactory triggerFactory;


class pgTrigger : public pgTriggerObject
{
public:
	pgTrigger(pgSchema *newSchema, const wxString &newName = wxT(""));
	~pgTrigger();

	int GetIconId();

	wxString GetTranslatedMessage(int kindOfMessage) const;
	void ShowTreeDetail(ctlTree *browser, frmMain *form = 0, ctlListView *properties = 0, ctlSQLBox *sqlPane = 0);
	bool CanDropCascaded()
	{
		return !GetSystemObject() && pgSchemaObject::CanDrop();
	}

	wxString GetFireWhen() const;
	wxString GetEvent() const;
	wxString GetForEach() const;
	wxString GetFunction() const
	{
		return function;
	}
	void iSetFunction(const wxString &s)
	{
		function = s;
	}
	void iSetArguments(const wxString &s)
	{
		arguments = s;
	}
	wxString GetArguments() const
	{
		return arguments;
	}
	void iSetWhen(const wxString &s)
	{
		when = s;
	}
	wxString GetWhen() const
	{
		return when;
	}
	bool GetIsConstraint() const
	{
		return isconstraint;
	}
	void SetIsConstraint(const bool b)
	{
		isconstraint = b;
	}
	bool GetDeferrable() const
	{
		return deferrable;
	}
	void iSetDeferrable(const bool b)
	{
		deferrable = b;
	}
	bool GetDeferred() const
	{
		return deferred;
	}
	void iSetDeferred(const bool b)
	{
		deferred = b;
	}
	wxString GetLanguage() const
	{
		return language;
	}
	void iSetLanguage(const wxString &s)
	{
		language = s;
	}
	wxString GetSource() const
	{
		return source;
	}
	void iSetSource(const wxString &s)
	{
		source = s;
	}
	wxString GetReferences() const
	{
		return references;
	}
	void iSetReferences(const wxString &s)
	{
		references = s;
	}

	long GetTriggerType() const
	{
		return triggerType;
	}
	void iSetTriggerType(const long l)
	{
		triggerType = l;
	}
	bool GetEnabled() const
	{
		return enabled;
	}
	void SetEnabled(ctlTree *browser, const bool b);
	void iSetEnabled(const bool b)
	{
		enabled = b;
	}
	void iSetTriggerFunction(pgFunction *fkt)
	{
		triggerFunction = fkt;
	}
	wxString GetQuotedFullTable() const
	{
		return quotedFullTable;
	}
	void iSetQuotedFullTable(const wxString &s)
	{
		quotedFullTable = s;
	}
	OID GetFunctionOid() const
	{
		return functionOid;
	}
	void iSetFunctionOid(const OID d)
	{
		functionOid = d;
	}
	OID GetRelationOid() const
	{
		return relationOid;
	}
	void iSetRelationOid(const OID d)
	{
		relationOid = d;
	}
	wxString GetQuotedColumns() const
	{
		return quotedColumns;
	}
	wxString GetColumns() const
	{
		return columns;
	}
	wxArrayString GetColumnList() const
	{
		return columnList;
	}
	long GetColumnCount() const
	{
		return columnCount;
	}
	void iSetColumnCount(const long l)
	{
		columnCount = l;
	}
	void iSetParentIsTable(const bool b)
	{
		parentistable = b;
	}
	bool GetParentIsTable()
	{
		return parentistable;
	}

	void SetDirty();

	bool DropObject(wxFrame *frame, ctlTree *browser, bool cascaded);
	wxString GetSql(ctlTree *browser);
	bool CanRestore()
	{
		return true;
	}
	pgObject *Refresh(ctlTree *browser, const wxTreeItemId item);

	bool HasStats()
	{
		return false;
	}
	bool HasDepends()
	{
		return true;
	}
	bool HasReferences()
	{
		return true;
	}

	bool IsUpToDate();

protected:
	void ReadColumnDetails();

private:
	wxString function, quotedFullTable, arguments, when, language, source, columns, quotedColumns,references;
	wxArrayString columnList;
	long columnCount;
	OID functionOid, relationOid;
	long triggerType;
	bool enabled, parentistable, isconstraint, deferrable, deferred;
	pgFunction *triggerFunction;
};


class pgTriggerCollection : public pgSchemaObjCollection
{
public:
	pgTriggerCollection(pgaFactory *factory, pgSchema *sch);
	wxString GetTranslatedMessage(int kindOfMessage) const;
};


class enabledisableTriggerFactory : public contextActionFactory
{
public:
	enabledisableTriggerFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
	wxWindow *StartDialog(frmMain *form, pgObject *obj);
	bool CheckEnable(pgObject *obj);
	bool CheckChecked(pgObject *obj);
};

#endif
