<?php

namespace BancaDati;

use PDO;
use PDOException;

class BancaDati {
    private $dbName = "BancaDati";
    private $linkName = "localhost";
    private $user = "root";
    private $pw = "root";

    public $pdo;
    public function __construct() {
        $this->linkDB();
    }
    private function linkDB() {
        try {
            $this->pdo = new PDO("mysql:dbname=$this->dbName;host=$this->linkName"
                , $this->user
                , $this->pw
                , array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        } catch (PDOException $e) {
            die;
        }
    }
    public function createUUID()
    {
        $data = openssl_random_pseudo_bytes(16);
        $data[6] = chr(ord($data[6]) & 0x0f | 0x40);
        $data[8] = chr(ord($data[8]) & 0x3f | 0x80);
        return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
    }

    /**
     * Einheitliche Insert Funktion
     * @param string $table
     * @param array $values
     * @return void
     * author Simon Bock
     */
    public function insert(string $table, array $values){
        $value = "";
        $column = "";
        foreach ($values as $col => $v){
            $value .=  "'" . $v . "'" . ",";
            $column .= $col . ",";
        }
        $value = trim($value, ",");
        $column = trim($column, ",");

        $sql = "INSERT INTO $table ($column) VALUES ($value);";
        try {
            $sth = $this->pdo->prepare($sql);
            $sth->execute();
        }catch (PDOException $e){
            var_dump($e);
            die;
        }
    }

    /**
     * Einheitliche Update Funktion
     * @param string $table
     * @param string $id
     * @param array $values
     * @return void
     * @author Malte Schulze Hobeling
     */
    public function update(string $table, string $id, array $values){
        $value = "";
        foreach ($values as $col => $v){
            $value .= $col . "=" . $v . ",";
        }
        $value = trim($value, ",");

        $sql = "UPDATE " . $table . " SET " . $value . " WHERE `id` = " . $id . ";";
        try {
            $sth = $this->pdo->prepare($sql);
            $sth->execute();
        }catch (PDOException $e){
            die;
        }
    }

    /**
     * Einheitliche Delete Funktion
     * @param string $table
     * @param string $id
     * @return void
     * @author Malte Schulze Hobeling
     */
    public function delete(string $table, string $id){
        $sql = "DELETE FROM " . $table . " WHERE `id` = " . $id . ";";
        try {
            $sth = $this->pdo->prepare($sql);
            $sth->execute();
        }catch (PDOException $e){
            die;
        }
    }


    public function select(string $table, array $data, array $order = null){
        $where = "";
        foreach ($data as $col => $v) {
            if($where != ""){
                $where .= " AND ";
            }
            $where .= $col . "=" . "'" . $v . "'";
        }
        $sql = "SELECT * FROM ".$table." WHERE ".$where;
        if(isset($order["by"])){
            $sql .= " ORDER BY ".$order["by"];
        }
        if(isset($order["order"])){
            $sql .= $order["order"];
        }
        try {
            return $this->pdo->query($sql);
        }catch (PDOException $e){
            die;
        }
    }
}