<?php
class DB
{
	static $connect;
	protected $db_database = DB_DATABASE;
	protected $db_host = DB_HOST;
	protected $db_username = DB_USERNAME;
	protected $db_password = DB_PASSWORD;
	protected $db_name = DB_NAME;
	protected $db_prefix = DB_PREFIX;
	
	
	//parameters
	
	protected $error = null;
	protected $last_id = null;
	protected $query = null;
	protected $from = null;
	protected $select = '*';
	protected $where = null;
	protected $group = null;
	protected $order = null;
	protected $limit = null;
	protected $pagination_type = false;
	protected $per_page = 0;
	protected $get_arr = null;
	function __construct() 
	{      
		try {
			 self::$connect = new PDO("{$this->db_database}:host={$this->db_host};dbname={$this->db_name};charset=utf8mb4", "{$this->db_username}", "{$this->db_password}");
			 self::$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			 self::$connect->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8mb4");
		} catch ( PDOException $e ){
			 echo  '<b>Veritabanı bağlantısı sağlanamadı! - Hata Kodu: </b>'.$e->getMessage();
			 exit;
		}
    }
	public function now($type='datetime')
	{
		switch($type)
		{
			case 'timestamp';
			return time();
			case 'date';
			return date('m-d');
			case 'datetime';
			return date('Y-m-d H:i:s');
			default:
			return date('Y-m-d H:i:s');
			
		}
		
	}
	public function m_empty($data)
	{
		if($data=='' and $data!='0')
		{
			return true;
		}
		else
		{
			return false;
		}
		
	}
    public function query($query,$arr=false)
    {
        $this->reset();
        if($query!="")
        {
            try
            {
                $run =  self::$connect->prepare($query);
                if($arr)
                {
                    if(is_array($arr))
                    {
                        $run->execute($arr);
                        return $run;
                    }
                    else
                    {
                        $run->execute(array($arr));
                        return $run;
                    }
                }
                else
                {
                    $run->execute(); // Bu kısımda değişiklik yapıldı
                    return $run;
                }
            }
            catch (PDOException $e)
            {
                $this->error = $e->getMessage();
                return false;
            }
        }
        return false;
    }

    public function table($table)
    {
         $this->from = $this->db_prefix . $table;
        return $this;
    }
	public function select($fields)
	{
		$this->select = $fields;
		return $this;
	}
	public function where($field,$op='=',$values,$and='AND')
	{
		if(!$this->m_empty($field))
		{
			if(is_null($this->where))
			{
				$this->where="{$field} {$op} ?";
				$this->get_arr[] = $values;
			}
			else
			{

				$this->where.=" {$and} {$field} {$op} ?";
				$this->get_arr[] = $values;
			}
		}
		return $this;
	}
//	public function where_set($field,$op='=',$values,$and="AND")
//	{
//		if(!$this->m_empty($field) and !$this->m_empty($values))
//		{
//			if(is_null($this->where))
//			{
//				$this->where="{$field} {$op} {$values}";
//			}
//			else
//			{
//
//				$this->where.=" {$and} {$field} {$op} {$values}";
//			}
//		}
//		return $this;
//	}

    public function where_set($field, $op = '=', $values, $and = "AND")
    {
        if (!$this->m_empty($field) && !$this->m_empty($values)) {
            $values = "'%" . $values . "%'"; // LIKE operatörü için % karakterlerini ekleyin
            if (is_null($this->where)) {
                $this->where = "{$field} {$op} {$values}";
            } else {
                $this->where .= " {$and} {$field} {$op} {$values}";
            }
        }
        return $this;
    }
    public function where_sett($field,$op='=',$values,$and="AND", $end_bracket='')
    {
        if(!$this->m_empty($field) and !$this->m_empty($values))
        {
            if(is_null($this->where))
            {
                $this->where="{$field} {$op} {$values} {$end_bracket}";
            }
            else
            {

                $this->where.=" {$and} {$field} {$op} {$values} {$end_bracket}";
            }
        }
        return $this;
    }
	public function group($fields)
	{
		if(is_null($this->group))
		{
			$this->group = $fields;
		}
		else
		{
			$this->group .=",{$fields}";
		
		}
		return $this;
	}
	public function order($field,$type="desc")
	{
		if(!is_null($field))
		{
			if(is_null($this->order))
			{
				if(strtolower($field)=='rand()')
				{
					$this->order = $field;
				}
				else
				{
					$this->order = $field.' '.strtoupper($type);
				}
			}
			else
			{
				if(strtolower($field)=='rand()')
				{
					$this->order .=",{$fields}";
				}
				else
				{
					$this->order .= ','.$field.' '.strtoupper($type);
				}
			}
		
		}
		return $this;
	}
	public function limit($start,$end=null)
	{
		if(is_null($end))
		{
			if(is_numeric($start))
			{
				$this->limit = $start;
			}
		}
		else
		{
			if(is_numeric($start) and is_numeric($end))
			{
				$this->limit = "{$start},{$end}";
			}
		
		}
		return $this;
	}
	public function pagination($per_page)
	{
		if(is_numeric($per_page))
		{
			$this->per_page = $per_page;
			$this->pagination_type = true;
		}
		return $this;
	}
	public function get()
	{
		$query = "SELECT {$this->select} FROM {$this->from}";
		if(!is_null($this->where))
		{
			$query.=" where {$this->where}";
		}
		if(!is_null($this->group))
		{
			$query.=" group by {$this->group}";
		}
		if(!is_null($this->order))
		{
			$query.=" order by {$this->order}";
		}
		if($this->pagination_type)
		{
			$c_per_page = $this->per_page;
			$c_arr = $this->get_arr;
			$extra_query = preg_replace("#SELECT (.*?) FROM#","SELECT COUNT(*) as total_count FROM",$query);
			$all = $this->query($extra_query,$this->get_arr);
			if($all)
			{
					$total_count = $all->fetchAll(PDO::FETCH_ASSOC)[0]['total_count'];
					$page_count = ceil($total_count/$c_per_page);
					$current_page = (integer)m_u_g(DB_PAGINATION_GET) ? (integer)m_u_g(DB_PAGINATION_GET) : 1;
					$current_limit=($current_page - 1) * $c_per_page;
					$query = $query." limit {$current_limit},{$c_per_page}";
					$current_rows = $this->query($query,$c_arr);
					$data = $current_rows->fetchAll(PDO::FETCH_ASSOC);
					$return = array();
					$return['total_count'] = $total_count;
					$return['current_count'] = count($data);
					$return['total_page'] = $page_count;
					$return['current_page'] = $current_page;
					$return['data'] = $data;
					return $return;
			}
			else
			{
				return false;
			}
		}
		else
		{
			if(!is_null($this->limit))
			{
				$query.=" limit {$this->limit}";
			}
			
			$gets = $this->query($query,$this->get_arr);
			if($gets)
			{
					$data = $gets->fetchAll(PDO::FETCH_ASSOC);
					$return = array();
					$return['total_count'] = count($data);
					$return['data'] = $data;
					return $return;
			}
			else
			{
				return false;
			}
		}
	}
	public function get_var($field)
	{
		if($this->m_empty($field))
		{
			return false;
		}
		else
		{
			$query = "SELECT {$field} FROM {$this->from}";
			if(!is_null($this->where))
			{
				$query.=" where {$this->where}";
			}
			if(!is_null($this->order))
			{
				$query.=" order by id desc limit 1";
			}
			$gets = $this->query($query,$this->get_arr);
			if($gets)
			{
					return  $gets->fetchAll(PDO::FETCH_ASSOC)[0][$field];
			}
			else
			{
				return false;
			}
		}
		
	}
	public function get_vars()
	{
		
			$query = "SELECT * FROM {$this->from}";
			if(!is_null($this->where))
			{
				$query.=" where {$this->where}";
			}
			if(!is_null($this->order))
			{
				$query.=" order by id desc limit 1";
			}
			$gets = $this->query($query,$this->get_arr);
			if($gets)
			{
					return  $gets->fetchAll(PDO::FETCH_ASSOC)[0];
			}
			else
			{
				return false;
			}
		
	}
	public function count()
	{
		$grouped = false;
		$query = "SELECT count(*) as total_count FROM {$this->from}";
		if(!is_null($this->where))
		{
			$query.=" where {$this->where}";
		}
		if(!is_null($this->group))
		{
			$grouped = true;
			$query.=" group by {$this->group}";
		}
		if(!is_null($this->order))
		{
			$query.=" order by {$this->order}";
		}
		$gets = $this->query($query,$this->get_arr);
		if($gets)
		{
				if($grouped)
				{
					$count = 0;
					foreach($gets->fetchAll(PDO::FETCH_ASSOC) as $counts)
					{
						$count = $count+$counts['total_count'];
					}
					return $count;
				}
				else
				{
					return $gets->fetch(PDO::FETCH_ASSOC)['total_count'];
				}
		}
		else
		{
			return false;
		}
	}
	public function insert(array $data)
	{
		if(is_array($data))
		{
			$query = 'INSERT INTO '.$this->from;
			$keys = array_keys($data);
			$query.=' ('.implode(',',$keys).') values (';
			$query_add='';
			$values = array_values($data);
			foreach($values as $val)
			{
				$query_add.='?,';
			}
			$query_add = trim($query_add,',');
			$query.=$query_add.')';
			if($this->query($query,$values))
			{
				
				$this->last_id = self::$connect->lastInsertId();
				return $this->last_id;
			}
			else
			{
				
				return false;
			}
		}
		return false;

	}


    public function update(array $data)
    {
        if (is_array($data)) {
            $query = "UPDATE {$this->from} SET";
            $keys = array_keys($data);
            $values = array_values($data);
            $query_add = '';

            foreach ($keys as $key) {
                $query_add .= " {$key} = ?,";
            }

            $query_add = trim($query_add, ',');
            $query .= $query_add;

            if (!is_null($this->where)) {
                $query .= " WHERE {$this->where}";
            }

            $new = $values;

            if (!empty($this->get_arr)) {
                $new = array_merge($new, $this->get_arr);
            }

            if ($this->query($query, $new)) {
                return true;
            } else {
                return false;
            }
        }

        return false;
    }
	public function delete()
	{
		$query = "DELETE FROM {$this->from}";
		if(!is_null($this->where))
		{
			$query.=" where {$this->where}";
		}
		if($this->query($query,$this->get_arr))
		{
			
			return true;
		}
		else
		{
			
			return false;
		}

	}
	public function error()
	{
		return $this->error;
		
	}
	public function last_id()
	{
		return $this->last_id;
	}
	protected function reset()
	{
		$this->error = null;
		$this->last_id = null;
		$this->query = null;
		$this->from = null;
		$this->select = '*';
		$this->where = null;
		$this->group = null;
		$this->order = null;
		$this->limit = null;
		$this->pagination_type = false;
		$this->per_page = 0;
		$this->get_arr = null;
	}
}
$db = new DB();
?>