<?php
class Database {
    private $host = DB_HOST;
    private $user = DB_USER;
    private $pass = DB_PASS;
    private $dbname = DB_NAME;

    private $dbh;
    private $stmt;

    private static $instance = null;

    public function __construct() {
        $dsn = "mysql:host={$this->host};dbname={$this->dbname};charset=utf8";
        $options = [
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ];

        try {
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        } catch (PDOException $e) {
            die('Erro ao conectar: ' . $e->getMessage());
        }
    }

    public static function getInstance() {
        if (!self::$instance) {
            self::$instance = new PDO(
                "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8",
                DB_USER,
                DB_PASS,
                [
                    PDO::ATTR_PERSISTENT => true,
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
                ]
            );
        }

        return self::$instance;
    }

    public function query($sql) {
        $this->stmt = $this->dbh->prepare($sql);
        return $this->stmt;
    }

    public function queryDireta($sql) {
        try {
            return $this->dbh->query($sql); // Executa direto (sem bind)
        } catch (PDOException $e) {
            die('Erro na consulta direta: ' . $e->getMessage());
        }
    }

    public function bind($param, $value, $type = null) {
        if (is_null($type)) {
            $type = match(true) {
                is_int($value)   => PDO::PARAM_INT,
                is_bool($value)  => PDO::PARAM_BOOL,
                is_null($value)  => PDO::PARAM_NULL,
                default          => PDO::PARAM_STR,
            };
        }
        $this->stmt->bindValue($param, $value, $type);
    }

    public function execute() {
        return $this->stmt->execute();
    }

    public function resultSet() {
        $this->execute();
        return $this->stmt->fetchAll(PDO::FETCH_OBJ);
    }

    public function single() {
        $this->execute();
        return $this->stmt->fetch(PDO::FETCH_OBJ);
    }

    public function rowCount() {
        return $this->stmt->rowCount();
    }

    public function lastInsertId() {
        return $this->dbh->lastInsertId();
    }

    // === ALIASES PARA COMPATIBILIDADE COM SEUS MODELS EM PORTUGUÊS ===
    public function resultados() {
        return $this->resultSet();
    }

    public function resultado() {
        return $this->single();
    }

    public function executa() {
        return $this->execute();
    }

    public function ultimoIdInserido() {
        return $this->lastInsertId();
    }

    public function ultimoId() {
        return $this->dbh->lastInsertId();
    }

    public function erro() {
        if ($this->stmt) {
            return $this->stmt->errorInfo();
        }
        return ['Sem statement ativo'];
    }
}
