<?php
/**
 * Query
 *
 * Free Query Builder / Database Abstraction Layer
 *
 * @package		Query
 * @author		Timothy J. Warren
 * @copyright	Copyright (c) 2012 - 2014
 * @link 		https://github.com/aviat4ion/Query
 * @license		http://philsturgeon.co.uk/code/dbad-license
 */

// --------------------------------------------------------------------------

namespace Query\Table;

/**
 * Abstract class defining database / table creation methods
 *
 * @package Query
 * @subpackage Table_Builder
 */
class Table_Builder {

	/**
	 * The name of the current table
	 * @var string
	 */
	protected $name = '';

	/**
	 * Driver for the current db
	 * @var Driver_Interface
	 */
	private $driver = NULL;

	/**
	 * Options for the current table
	 * @var array
	 */
	private $table_options = array();

	/**
	 * Columns to be added/updated for the current table
	 * @var array
	 */
	private $columns = array();

	/**
	 * Indexes to be added/updated for the current table
	 * @var array
	 */
	private $indexes = array();

	/**
	 * Foreign keys to be added/updated for the current table
	 * @var array
	 */
	private $foreign_keys = array();

	// --------------------------------------------------------------------------

	/**
	 * Constructor
	 *
	 * @param string $name
	 * @param array $options
	 * @param Driver_Interface $driver
	 * @return Table_Builder
	 */
	public function __construct($name, $options = array(), \Query\Driver\Driver_Interface $driver = NULL)
	{
		$this->name = $name;

		if ( ! empty($options))
		{
			$this->table_options = array_merge($this->table_options, $options);
		}

		if ( ! is_null($driver))
		{
			$this->driver = $driver;
		}

		return $this;
	}

	// --------------------------------------------------------------------------

	/**
	 * Alias to constructor
	 *
	 * @param string $name
	 * @param array $options
	 * @param \Query\Driver_Interface $driver
	 */
	public function __invoke($name, $options = array(), \Query\Driver\Driver_Interface $driver = NULL)
	{
		$this->__construct($name, $options, $driver);
	}

	// --------------------------------------------------------------------------

	/**
	 * Set the reference to the current database driver
	 *
	 * @param \Query\Driver_Interface $driver
	 * @return \Query\Table_Builder
	 */
	public function set_driver(\Query\Driver_Interface $driver)
	{
		$this->driver = $driver;
		return $this;
	}

	// --------------------------------------------------------------------------

	/**
	 * Get the current DB Driver
	 *
	 * @return \Query\Driver_Interface
	 */
	public function get_driver()
	{
		return $this->driver;
	}

	// --------------------------------------------------------------------------
	// ! Column Methods
	// --------------------------------------------------------------------------

	/**
	 * Add a column to the current table
	 *
	 * @param string $column_name
	 * @param string $type
	 * @param array $options
	 */
	public function add_column($column_name, $type = NULL, $options = array())
	{
		$col = new Table_Column($column_name, $type, $options);
		$this->columns[] = $col;
	}

	// --------------------------------------------------------------------------

	public function remove_column($column_name)
	{

	}

	// --------------------------------------------------------------------------

	public function rename_column($old_name, $new_name)
	{

	}

	// --------------------------------------------------------------------------

	public function change_column($column_name, $new_column_type, $options = array())
	{

	}

	// --------------------------------------------------------------------------

	public function has_column($column_name, $options = array())
	{

	}

	// --------------------------------------------------------------------------
	// ! Index Methods
	// --------------------------------------------------------------------------

	public function add_index($columns, $options = array())
	{

	}

	// --------------------------------------------------------------------------

	public function remove_index($columns, $options = array())
	{

	}

	// --------------------------------------------------------------------------

	public function remove_index_by_name($name)
	{

	}

	// --------------------------------------------------------------------------

	public function has_index($columns, $options = array())
	{

	}

	// --------------------------------------------------------------------------
	// ! Foreign Key Methods
	// --------------------------------------------------------------------------

	public function add_foreign_key($columns, $referenced_table, $referenced_columns = array('id'), $options = array())
	{

	}

	// --------------------------------------------------------------------------

	public function drop_foreign_key($columns, $constraint = NULL)
	{

	}

	// --------------------------------------------------------------------------

	public function has_foreign_key($columns, $constraint = NULL)
	{

	}

	// --------------------------------------------------------------------------
	// ! Table-wide methods
	// --------------------------------------------------------------------------

	public function exists()
	{

	}

	// --------------------------------------------------------------------------

	public function drop()
	{

	}

	// --------------------------------------------------------------------------

	public function rename($new_table_name)
	{

	}

	// --------------------------------------------------------------------------

	public function get_columns()
	{

	}


	// --------------------------------------------------------------------------
	// ! Action methods
	// --------------------------------------------------------------------------

	public function create()
	{

	}

	// --------------------------------------------------------------------------

	public function update()
	{

	}

	// --------------------------------------------------------------------------

	public function save()
	{
		($this->exists())
			? $this->update()
			: $this->create();

		$this->reset();
	}

	// --------------------------------------------------------------------------

	public function reset()
	{

	}

}
// End of table_bulider.php