import QtQuick 2.2
import QtQuick.Controls.Styles 1.1
import QtQuick.Controls 1.1
import QtQuick.Dialogs 1.1
import QtQuick.Layouts 1.1
import org.ethereum.qml.QEther 1.0
import "js/QEtherHelper.js" as QEtherHelper

Rectangle {
	color: "#ededed"
	id: stateListContainer
	focus: true
	anchors.topMargin: 10
	anchors.left: parent.left
	height: parent.height
	width: parent.width
	property var stateList: []

	Connections {
		target: projectModel
		onProjectClosed: {
			stateListModel.clear();
		}
		onProjectLoaded: {
			if (!projectData.states)
				projectData.states = [];
			var items = projectData.states;
			for(var i = 0; i < items.length; i++) {
				stateListModel.append(items[i]);
				stateList.push(items[i])
			}
		}
		onProjectSaving: {
			projectData.states = stateList;
		}
	}

	ListView {
		anchors.top: parent.top
		height: parent.height
		width: parent.width
		model: stateListModel
		delegate: renderDelegate
	}

	Button {
		anchors.bottom: parent.bottom
		action: addStateAction
	}

	StateDialog {
		id: stateDialog
		onAccepted: {
			var item = stateDialog.getItem();
			if (stateDialog.stateIndex < stateListModel.count) {
				stateList[stateDialog.stateIndex] = item;
				stateListModel.set(stateDialog.stateIndex, item);
			} else {
				stateList.push(item);
				stateListModel.append(item);
			}

			stateListModel.save();
		}
	}

	ListModel {
		id: stateListModel

		function addState() {
			var ether = QEtherHelper.createEther("100000000000000000000000000", QEther.Wei);
			var item = {
				title: "",
				balance: ether,
				transactions: []
			};

			var ctorTr = {
				value: QEtherHelper.createEther("100", QEther.Wei),
				functionId:  qsTr("Constructor"),
				gas: QEtherHelper.createEther("125000", QEther.Wei),
				gasPrice: QEtherHelper.createEther("10000000000000", QEther.Wei),
				executeConstructor: true
			};

			item.transactions.push(ctorTr);
			stateDialog.open(stateListModel.count, item);
		}

		function editState(index) {
			stateDialog.open(index, stateList[index]);
		}

		function runState(index) {
			var item = stateList[index];
			clientModel.debugState(item);
		}

		function deleteState(index) {
			stateListModel.remove(index);
			stateList.splice(index, 1);
			save();
		}

		function save() {
			projectModel.saveProject();
		}
	}

	Component {
		id: renderDelegate
		Item {
			id: wrapperItem
			height: 20
			width: parent.width
			RowLayout {
				anchors.fill: parent
				Text {
					Layout.fillWidth: true
					Layout.fillHeight: true
					text: title
					font.pointSize: 12
					verticalAlignment: Text.AlignBottom
				}
				ToolButton {
					text: qsTr("Edit");
					Layout.fillHeight: true
					onClicked: stateListModel.editState(index);
				}
				ToolButton {
					text: qsTr("Delete");
					Layout.fillHeight: true
					onClicked: stateListModel.deleteState(index);
				}
				ToolButton {
					text: qsTr("Run");
					Layout.fillHeight: true
					onClicked:
					{
						stateListModel.runState(index)
					}
				}
			}
		}
	}

	Action {
		id: addStateAction
		text: "&Add State"
		shortcut: "Ctrl+T"
		enabled: codeModel.hasContract && !clientModel.running;
		onTriggered: stateListModel.addState();
	}
}