<?php

namespace Fury\Modules\ThinBuilder;

interface ThinBuilderInterface{

	/**
	 * Send raw sql query and get result. Logging sql queries to history
	 *
	 * @method query
	 *
	 * @param  String $sql Raw sql string
	 * @param  String|string $fetch_func String name of handler function (fetch, fetchAll ...)
	 * @param  Int $fetch_func_param an example "PDO::FETCH_ASSOC"
	 *
	 * @return Result of query
	 */
	public function query(String $sql, String $fetch_func = '', Int $fetch_func_param = NULL);

	/**
	 * Select rows from db table
	 *
	 * @method select
	 *
	 * @param  String $tablename Name of the table we are working with
	 * @param  array $fields Needed fields
	 * @param  array $where Array with conditions
	 * @param  array $order_fields Fields of sort
	 * @param  String|string $order_sort Type of sort (ASC OR DESC)
	 * @param  array $limit Limits for selecting
	 *
	 * @return array Result of selecting
	 */
	public function select(String $tablename, $fields = [], $where = [], $order_fields = [], String $order_sort = 'DESC', $limit = []);

	/**
	 * Insert row to db table
	 *
	 * @method insert
	 *
	 * @param  String $tablename Name of the table we are working with
	 * @param  Array $data Data for inserting
	 *
	 * @return boolean Result of working
	 */
	public function insert(String $tablename, Array $data);

	/**
	 * Update data in table rows
	 *
	 * @method update
	 *
	 * @param  String $tablename Name of the table we are working with
	 * @param  Array $data New data for rows
	 * @param  array $where Array with conditions. What rows we want to change
	 *
	 * @return boolean Result of updating
	 */
	public function update(String $tablename, Array $data, $where = []);

	/**
	 * Delete selected rows from db table
	 *
	 * @method delete
	 *
	 * @param  String $tablename Name of the table we are working with
	 * @param  array $where Array with conditions. What rows we want to delete
	 *
	 * @return boolean Result of deleting
	 */
	public function delete(String $tablename, $where = []);

	/**
	 * Drop selected table from db
	 *
	 * @method drop
	 *
	 * @param  String $tablename Name of the table what we want to drop
	 *
	 * @return boolean Result of dropping
	 */
	public function drop(String $tablename);

	/**
	 * Truncate selected db table
	 *
	 * @method truncate
	 *
	 * @param  String $tablename Name of the table what we want to truncate
	 *
	 * @return boolean Result of truncating
	 */
	public function truncate(String $tablename);

	/**
	 * Create new table in to db
	 *
	 * @method create_table
	 *
	 * @param  String $tablename Name of new table
	 * @param  Array $fields Array with fields and fields parameters
	 * @param  String $primary_key Name of field what we want selecting like primary key
	 * @param  string $engine Name of db engine
	 *
	 * @return boolean Result of creating
	 */
	public function create_table(String $tablename, Array $fields, String $primary_key, $engine = 'InnoDB');

	/**
	 * Get table fields
	 *
	 * @method table_fields
	 *
	 * @param  String $tablename Name of the table we are working with
	 *
	 * @return Array list of fields
	 */
	public function table_fields(String $tablename);

	/**
	 * List of table from in database
	 *
	 * @method tables
	 *
	 * @return Array list of tables
	 */
	public function tables();

	/**
	 * Get count rows in selected db table
	 *
	 * @method count
	 *
	 * @param  String $tablename Selected db table
	 * @param  array $where Array with conditions
	 *
	 * @return Int Count rows in table
	 */
	public function count(String $tablename, $where = []);

	/**
	 * Get history object
	 *
	 * @method history
	 *
	 * @return History object
	 */
	public function history();

	/**
	 * Turn off processing sql, function query() return just text of sql query
	 * @return ThinBuilder
	 */
	public function sql_for();
}