<?php
namespace mydb\App\classes\user_mvc_class;
use mydb\App\classes\abstractClasses\AbstractCrud;
use PDO;
use PDOException;
class Model extends AbstractCrud {
    //private $conn;
    protected $rows;
    protected $datetime=null;
    protected $first_name=null;
    protected $last_name=null;
    protected $corridor=null;
    protected $room=null;
    protected $bed=null;
    protected $proven=null;
    protected $ID=null;
    protected $list_sql="select * from users";
    protected $param=[];
    protected $info = "";
    protected $save_update="save";
    protected $action="none";

    //function __construct(){
      //  $this->conn(); //nicht notwendig, da die Verbindung über den Methodaufruf conn() erfolgt! 
    //}
    
    protected function get_rows(){
        $this->list_sql = "SELECT * FROM users ORDER BY datetime DESC"; // Hier fügen Sie die ORDER BY Klausel hinzu
        $stmt = $this->conn()->prepare($this->list_sql);
        $stmt->execute($this->param);
        $this->rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

protected function save(){
    // Überprüfen, ob die anderen Felder leer sind
    if($_POST['first_name']=="" || $_POST['last_name']=="" || $_POST['corridor']=="" || $_POST['room']=="") {
        $this->info = "Füllen Sie bitte alle Felder aus!";
        return;
    }   

        // Überprüfen, ob ein Eintrag bereits vorhanden ist
        $checkSql = "SELECT * FROM users WHERE first_name = :first_name AND last_name = :last_name AND corridor = :corridor AND room = :room AND bed = :bed";
        $checkStmt = $this->conn()->prepare($checkSql);
        $checkStmt->execute([
            ':first_name' => $_POST['first_name'], 
            ':last_name' => $_POST['last_name'], 
            ':corridor' => $_POST['corridor'], 
            ':room' => $_POST['room'], 
            ':bed' => $_POST['bed']
        ]);
    
        $provenValue = isset($_POST['proven']) ? 1 : 0;  // Wert von proven basierend auf Checkbox-Status
    
        if ($checkStmt->rowCount() > 0) {
            // Wenn ein Eintrag gefunden wird, dann prüfen Sie, ob proven bereits aktiviert ist
            $existingEntry = $checkStmt->fetch(PDO::FETCH_ASSOC);
            
            // Wenn proven nicht aktiviert ist, dann aktualisieren Sie es
            if ($existingEntry['proven'] != 1) {
                $updateSql = "UPDATE users SET proven = :proven, datetime = NOW() WHERE first_name = :first_name AND last_name = :last_name AND corridor = :corridor AND room = :room AND bed = :bed";
                $updateStmt = $this->conn()->prepare($updateSql);
                $updateStmt->execute([
                    ':proven' => $provenValue,
                    ':first_name' => $_POST['first_name'], 
                    ':last_name' => $_POST['last_name'], 
                    ':corridor' => $_POST['corridor'], 
                    ':room' => $_POST['room'], 
                    ':bed' => $_POST['bed']
                ]);
    
                if ($updateStmt->rowCount() > 0) {
                    $this->info = "Eintrag aktualisiert!";
                } else {
                    $this->info = "Fehler beim Aktualisieren!";
                }
            } else {
                // Nur andere Felder aktualisieren, nicht proven
                $updateSql = "UPDATE users SET datetime = NOW() WHERE first_name = :first_name AND last_name = :last_name AND corridor = :corridor AND room = :room AND bed = :bed";
                $updateStmt = $this->conn()->prepare($updateSql);
                $updateStmt->execute([
                    ':first_name' => $_POST['first_name'], 
                    ':last_name' => $_POST['last_name'], 
                    ':corridor' => $_POST['corridor'], 
                    ':room' => $_POST['room'], 
                    ':bed' => $_POST['bed']
                ]);
    
                if ($updateStmt->rowCount() > 0) {
                    $this->info = "Eintrag aktualisiert, proven wurde nicht geändert!";
                } else {
                    $this->info = "Fehler beim Aktualisieren!";
                }
            }
        } else {
            // Neuen Eintrag hinzufügen
            $sql = "INSERT INTO users (datetime, first_name, last_name, corridor, room, bed, proven) VALUES (NOW(), :first_name, :last_name, :corridor, :room, :bed, :proven)";
            $stmt = $this->conn()->prepare($sql);
            $stmt->execute([
                ':first_name' => $_POST['first_name'], 
                ':last_name' => $_POST['last_name'], 
                ':corridor' => $_POST['corridor'], 
                ':room' => $_POST['room'], 
                ':bed' => $_POST['bed'], 
                ':proven' => $provenValue
            ]);
    
            if($stmt->rowCount() > 0) {
                $this->info = "Datensatz wurde gespeichert!";
            } else {
                $this->info = "Kein Datensatz gespeichert!";
            }
        }
    }
    

    protected function edit() {
        $this->save_update = "update";
        if (isset($_POST['id'])) {
            $sql = "SELECT * FROM users WHERE ID=:id";
            $stmt = $this->conn()->prepare($sql);
            $stmt->execute(['id' => $_POST['id']]);
            $row = $stmt->fetch(PDO::FETCH_ASSOC);
            
            if ($row) {
                $this->first_name = $row['first_name'];
                $this->last_name = $row['last_name'];
                $this->corridor = $row['corridor'];
                $this->room = $row['room'];
                $this->bed = $row['bed'];
                $this->proven = $row['proven'];
                $this->ID = $row['id'];
            } else {
                $this->info = "Datensatz nicht gefunden!";
            }
        } else {
            $this->info = "ID nicht gesetzt!";
        }
    }

    protected function update(){
        if (!isset($_POST['id'])) {
            $this->info = "ID nicht gesetzt!";
            return;
        }
    
        // Überprüfen, ob 'proven' im $_POST Array gesetzt ist
        $provenValue = isset($_POST['proven']) ? $_POST['proven'] : 0;
        
        $sql = "UPDATE users SET datetime = NOW(), first_name = :first_name, last_name = :last_name, corridor = :corridor, room = :room, bed = :bed, proven = :proven WHERE ID = :id";
        $stmt = $this->conn()->prepare($sql);
        
        $stmt->execute([
            'first_name' => $_POST['first_name'],
            'last_name' => $_POST['last_name'],
            'corridor' => $_POST['corridor'],
            'room' => $_POST['room'],
            'bed' => $_POST['bed'],
            'proven' => $provenValue,  // Verwenden Sie hier den überprüften Wert
            'id' => $_POST['id']
        ]);
        
        if ($stmt->rowCount() > 0) {
            $this->info = $stmt->rowCount() . " Datensatz verändert!";
        } else {
            $this->info = "Kein Datensatz verändert/gespeichert!";
        }
    }

    protected function delete(){
        $sql = "DELETE FROM users WHERE ID=:id";
        $stmt = $this->conn()->prepare($sql);
        $stmt->execute(['id'=>$_POST['id']]);
        if ($stmt->rowCount() > 0) $this->info = $stmt->rowCount() . " Datensatz gelöscht!";
        else $this->info = "Der Datensatz wurde nicht gelöscht!";
    }

    
protected function search() {
    if (isset($_POST['search']) && !empty(trim($_POST['search']))) {
        echo "Suchbegriff (Debug): " . $_POST['search'] . "<br>";
        $searchTerm = "%" . $_POST['search'] . "%";

        // SQL-Statement vorbereiten
        $this->list_sql = "SELECT * FROM users 
        WHERE `first_name` LIKE :search 
        OR `last_name` LIKE :search 
        OR `corridor` LIKE :search 
        OR `room` LIKE :search 
        OR `bed` LIKE :search";

        // Debug-Ausgaben für SQL-Statement und Suchbegriff
        echo "SQL-Statement: " . $this->list_sql . "<br>"; 
        echo "Suchbegriff: " . $searchTerm . "<br>"; 

        $stmt = $this->conn()->prepare($this->list_sql);
        $stmt->bindParam(':search', $searchTerm, PDO::PARAM_STR);

        if (!$stmt->execute()) {
            echo "Fehler bei der Ausführung der Abfrage: " . print_r($stmt->errorInfo(), true);
            return;
        }

        // Ergebnisse abrufen und zu $this->rows zuweisen
        $this->rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

        // Debug-Ausgabe für die zurückgegebenen Ergebnisse
        echo "Anzahl der zurückgegebenen Ergebnisse: " . count($this->rows) . "<br>";
        echo "Ausgegebene Daten: <pre>" . print_r($this->rows, true) . "</pre>";

        // Führende Nullen für die Werte in den Feldern corridor, room und bed hinzufügen
        foreach ($this->rows as &$row) {
            $row['corridor'] = sprintf('%02d', $row['corridor']);
            $row['room'] = sprintf('%02d', $row['room']);
            $row['bed'] = sprintf('%02d', $row['bed']);
        }
        unset($row); // Entfernen Sie die Referenz, um unerwartete Nebeneffekte zu vermeiden

        if (count($this->rows) > 0) {
            $this->info = count($this->rows) . " Ergebnisse gefunden!";
        } else {
            $this->info = "Keine Ergebnisse gefunden!";
        }
    } else {
        $this->info = "Suchbegriff nicht angegeben!";
    }
}
}