<?php

class Db{
	private static $join;
	private static $commandDatabase = array (
		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
		PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
		PDO::ATTR_EMULATE_PREPARES => false
	);

	public static function connect ($host, $user, $password, $database) {
		if (!isset (self::$join)) {
			self::$join = @new PDO(
				"mysql:host=$host;dbname=$database;charset=utf8",
				$user,
				$password,
				self::$commandDatabase
			);
			self::$join->exec ("set names utf8");
		}
	}

	public static function disconect(){
		self::$join = null;
	}

	public static function loadOne ($sql, $values = array (), $numberKey = false) {
		$answer = self::$join->prepare ($sql);
		$answer->execute ($values);
		if (!$numberKey) {
			return $answer->fetch (PDO::FETCH_ASSOC);
		} else {
			return $answer->fetch (PDO::FETCH_NUM);
		}
	}

	public static function command ($sql, $values = array()) {
		$answer = self::$join->prepare ($sql);
		return $answer->execute ($values);
	}

	public static function loadAll ($sql, $values = array(), $numberKey = false) {
		$answer = self::$join->prepare ($sql);
		$answer->execute ($values);
		if (!$numberKey) {
			return $answer->fetchALL (PDO::FETCH_ASSOC);
		} else {
			return $answer->fetchALL (PDO::FETCH_NUM);
		}
	}

	public static function loadAlone ($sql, $values = array()) {
		$answer = self::$join->prepare ($sql);
		$answer->execute ($values);
		return $answer->fetch (PDO::FETCH_NUM)[0];
	}

	public static function add ($table, $values = array()) {
		return self::command (
			"INSERT INTO `$table` (`" .
			implode('`, `', array_keys($values)) .
			"`) VALUES (" .
			str_repeat('?,', (count($values) > 0 ? count($values)-1 : 0)) .
			"?)"
			, array_values ($values)
		);
	}
	// TODO: pokud vlozim prazdne pole tak chyba ??
	public static function addAll ($table, $values = array ()) {
		try {
			foreach ($values as $value) {
				self::add ($table, $value);
			}
		} catch (PDOException $ex) {
			throw new PDOException ($ex->getMessage());
		}
	}

	public static function edit ($table, $values = array(), $conditions, $values2 = array()) {
		return self::command (
			"UPDATE `$table` SET `" .
			implode('` =?, `', array_keys($values)) .
			"` =? " .
			$conditions
			, array_merge (array_values ($values), $values2)
		);
	}

	public static function insertId () {
		return self::$join->lastInsertId ();
	}

	public static function addId ($lastTable, $lastIdName) {
		$answer = self::$join->prepare ("SELECT `$lastIdName` FROM `$lastTable` ORDER BY `$lastIdName` DESC");
		$answer->execute ();
		return $answer->fetch (PDO::FETCH_NUM)[0];
	}
}