var Model = require('./model');

module.exports = new Class({
	Properties: {
		/**
		 * The model associated to this form.
		 */
		model: { 
			type: Model
		},
		/**
		 * The row where the form positioned, has -1 if the row is unselected.
		 */
		row: { 
			type: Number
		},
		/**
		 * The number of rows in the form.
		 */
		numRows: {
			type: Number
		},
		/**
		 * Checks if the form data is ready.
		 */
		ready: {
			type: Boolean
		},
		/**
		 * The row object.
		 */
		$: {
			type: Object
		}
	}

	,_model: null
	,_row: -1
	
	,async refresh() {
		if (this._model)
			await this._model.refresh();
	}

	/**
	 * Emits the 'change' signal on the form.
	 */
	,iterChanged() {
		this.emit('change');
	}
	
	/**
	 * Get the index of the column from its name.
	 *
	 * @param {String} columnName The column name
	 * @return {integer} The column index or -1 if column not exists
	 */
	,getColumnIndex(columnName) {
		if (this._model)
			return this._model.getColumnIndex(columnName);
			
		return -1;
	}
	
	,insertRow() {
		if (this._model)
			this.row = this._model.insertRow();
	}
	
	,async performOperations() {
		if (this._model)
			await this._model.performOperations();
	}

	/**
	 * Removes the current row.
	 */
	,async deleteRow() {
		if (this._row >= 0)
			await this._model.deleteRow(this._row);
	}

	/**
	 * Gets the row as object.
	 *
	 * @return {Object} The row
	 */
	,getObject() {
		return this._model.getObject(this._row);
	}

	/**
	 * Sets a value on the form.
	 *
	 * @param {String} columnName The column name
	 */
	,get(columnName) {
		if (!this._model) return undefined;
		return this._model.get(this._row, columnName);
	}

	/**
	 * Sets a value on the form.
	 *
	 * @param {String} columnName The column name
	 * @param {Object} value The new value
	 */
	,async set(columnName, value) {
		return await this._model.set(this._row, columnName, value);
	}

	/**
	 * Gets a value from the form using the column index.
	 *
	 * @param {String} columnName The column index
	 * @return {Object} The value
	 */
	,getByIndex(column) {
		return this._model.getByIndex(this._row, column);
	}

	/**
	 * Sets a value on the form using the column index.
	 *
	 * @param {String} columnName The column index
	 * @param {Object} value The new value
	 */
	,setByIndex(column, value) {
		return this._model.setByIndex(this._row, column, value);
	}
});