<?php
// app/Core/Database.php

class Database {
    private $host = DB_HOST;
    private $user = DB_USER;
    private $pass = DB_PASS;
    private $dbname = DB_NAME;
    private $charset = DB_CHARSET;

    protected $dbh; // Database Handler
    protected $stmt; // Statement

    public function __construct() {
        // DSN (Data Source Name) Kurulumu
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=' . $this->charset;
        
        $options = [
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ // Verileri obje olarak çekelim ($ilan->baslik gibi)
        ];

        try {
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        } catch (PDOException $e) {
            die("Veritabanı Bağlantı Hatası: " . $e->getMessage());
        }
    }

    // Sorgu Hazırla
    public function query($sql) {
        $this->stmt = $this->dbh->prepare($sql);
    }

    // Parametre Bağla (SQL Injection koruması)
    public function bind($param, $value, $type = null) {
        if (is_null($type)) {
            switch (true) {
                case is_int($value):
                    $type = PDO::PARAM_INT;
                    break;
                case is_bool($value):
                    $type = PDO::PARAM_BOOL;
                    break;
                case is_null($value):
                    $type = PDO::PARAM_NULL;
                    break;
                default:
                    $type = PDO::PARAM_STR;
            }
        }
        $this->stmt->bindValue($param, $value, $type);
    }

    // Sorguyu Çalıştır
    public function execute() {
        return $this->stmt->execute();
    }

    // Çoklu Sonuç Getir (Liste)
    public function resultSet() {
        $this->execute();
        return $this->stmt->fetchAll();
    }

    // Tek Sonuç Getir (Detay sayfası için)
    public function single() {
        $this->execute();
        return $this->stmt->fetch();
    }
}