<?php


namespace DB;


class DB{

    private $connection;

    public function __construct($hostname, $username, $password, $database, $port = '3306') {
        $this->connection = new \mysqli($hostname, $username, $password, $database, $port);

        if ($this->connection->connect_error) {
            throw new \Exception('Error: ' . $this->connection->error . '<br />Error No: ' . $this->connection->errno);
        }

        $this->connection->set_charset("utf8");
        $this->connection->query("SET SQL_MODE = ''");
    }

    public function query($sql) {
        $query = $this->connection->query($sql);

        if (!$this->connection->errno) {
            if ($query instanceof \mysqli_result) {
                $data = array();

                while ($row = $query->fetch_assoc()) {
                    $data[] = $row;
                }

                $result = new \stdClass();
                $result->num_rows = $query->num_rows;
                $result->row = isset($data[0]) ? $data[0] : array();
                $result->rows = $data;

                $query->close();

                return $result;
            } else {
                return true;
            }
        } else {
            throw new \Exception('Error: ' . $this->connection->error  . '<br />Error No: ' . $this->connection->errno . '<br />' . $sql);
        }
    }

    public function getRows($sql){

        $rows = $this->query($sql);
        return $rows->rows;
    }

    public function getRowsJson($sql){

        $rows = $this->query($sql);
        return json_encode($rows->rows);
    }


    public function getRow($sql){

        $rows = $this->query($sql);
        return $rows->row;
    }

    public function getTotal($key,$row){
        $total = $this->query("SELECT COUNT(DISTINCT ".$key.") as total FROM ".DBPREFIX.$row);
        return $total->row['total'];
    }

    public function escape($value) {
        return $this->connection->real_escape_string($value);
    }

    public function countAffected() {
        return $this->connection->affected_rows;
    }

    public function getLastId() {
        return $this->connection->insert_id;
    }

    public function connected() {
        return $this->connection->ping();
    }

    public function newOrderId() {
        return ORDER_CODE.rand(111111,999999);
    }

    public function __destruct() {
        $this->connection->close();
    }

}