<?php

declare(strict_types = 1);

namespace MyApp\Model;

use MyApp\Entity\Chambre;
use MyApp\Entity\Type_chambre;
use PDO;

class Chambre_Model{
    private PDO $db;

    public function __construct(PDO $db){
        $this->db = $db;
    }

    // on récup toutes les enregistrements de la BDD
    public function getAllChambre():array{
        $sql = "SELECT Chambre.*, Type_chambre.* FROM Chambre Join Type_chambre ON Type_chambre.Id_type_chambre = Chambre.Id_type_chambre";
        $stmt = $this->db->query($sql); // contient l'ensemble des résultats
        $chambre=[];
        // on organise sous forme d'un tableau les valeurs récupérées
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)){

            $typeChambre = null; 
            if ($row['Id_type_chambre'] !== null) {
                $typeChambre = new Type_chambre($row['Id_type_chambre'], $row['Nom_type']);
            }
            $chambre[] = new Chambre($row['Id_chambre'], $row['Nom'], floatval($row['Prix']), $row['Nbr_lit'], $row['Num_chambre'], $row['Description'], floatval($row['Superficie']), $row['Etat'], $typeChambre);
        }


        return $chambre;
    }
    // on récupère un enregistrement de la base de données
    public function getOneChambre(int $id):?Chambre{
        $sql = "SELECT * from Chambre Join Type_chambre ON Type_chambre.Id_type_chambre = Chambre.Id_chambre where Chambre.Id_chambre = :id";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(":id", $id);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if(!$row){
            return null;
        }

        $typeChambre = null; 
            if ($row['Id_type_chambre'] !== null) {
                $typeChambre = new Type_chambre($row['Id_type_chambre'], $row['Nom_type']);
            }
        return new Chambre($row['Id_chambre'], $row['Nom'], floatval($row['Prix']), $row['Nbr_lit'], $row['Num_chambre'], $row['Description'], floatval($row['Superficie']), $row['Etat'], $typeChambre);
    }

    // récupéré des enregistrements en fonction d'une recherche
    public function getSearchChambre(?string $search):array{
        $sql = "SELECT Chambre.*, Type_chambre.* FROM Chambre JOIN Type_chambre ON Type_chambre.Id_type_chambre = Chambre.Id_type_chambre where Nom = :nom OR Prix = :prix OR Nbr_lit = :nbr_lit OR Num_chambre = :num_chambre OR Description = :description OR Superficie = :superficie OR Etat = :etat OR Type_chambre.Id_type_chambre = :id_type_chambre";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(":nom", $search);
        $stmt->bindValue(":prix", $search);
        $stmt->bindValue(":nbr_lit", $search);
        $stmt->bindValue(":num_chambre", $search);
        $stmt->bindValue(":description", $search);
        $stmt->bindValue(":superficie", $search);
        $stmt->bindValue(":etat", $search);
        $stmt->bindValue(":id_type_chambre", $search);
        $stmt->execute();
        $chambre=[];
        // on organise sous forme d'un tableau les valeurs récupérées
        while($row = $stmt->fetch(PDO::FETCH_ASSOC)){

            $type_chambre = null; 
            if ($row['Id_type_chambre'] !== null) {
                $type_chambre = new Type_chambre($row['Id_type_chambre'], $row['Nom_type']);
            }
            $chambre[] = new Chambre($row['Id_chambre'], $row['Nom'], floatval($row['Prix']), $row['Nbr_lit'], $row['Num_chambre'], $row['Description'], floatval($row['Superficie']), $row['Etat'], $type_chambre);
        }
        if($search === '' || $search === null){
            return $this->getAllChambre();
        }else{
            return $chambre;
        }
    }

    // on ajoute un enregistrement à la base de données
    public function createChambre(Chambre $chambre): bool {
        $sql = "INSERT INTO Chambre (Id_chambre, Nom, Prix, Nbr_lit, Num_chambre, Description, Superficie, Etat, Id_type_chambre) VALUES (:Id_chambre, :Nom, :Prix, :Nbr_lit, :Num_chambre, :Description, :Superficie, :Etat, :Id_type_chambre)";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(':Id_chambre', $chambre->getId(), PDO::PARAM_STR);
        $stmt->bindValue(':Nom', $chambre->getNom(), PDO::PARAM_STR);
        $stmt->bindValue(':Prix', $chambre->getPrix(), PDO::PARAM_STR);
        $stmt->bindValue(':Nbr_lit', $chambre->getNbr_lit(), PDO::PARAM_STR);
        $stmt->bindValue(':Num_chambre', $chambre->getNum_chambre(), PDO::PARAM_STR);
        $stmt->bindValue(':Description', $chambre->getDescription(), PDO::PARAM_STR);
        $stmt->bindValue(':Superficie', $chambre->getSuperficie(), PDO::PARAM_STR);
        $stmt->bindValue(':Etat', $chambre->getEtat(), PDO::PARAM_STR);
        $stmt->bindValue(':Id_type_chambre', $chambre->getId_type_chambre()->getId(), PDO::PARAM_STR);
        return $stmt->execute();
    }

    // suppprimer un enregistrement d'un compte
    public function deleteChambre(int $id): bool {
        $sql = "DELETE FROM Chambre WHERE Id_chambre = :id";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(':id', $id, PDO::PARAM_INT);
        return $stmt->execute();
        
    }

    // modifier l'enregistrement d'une chambre existente
    public function updateChambre(Chambre $chambre): bool {
        $sql = "UPDATE Chambre 
        SET Id_chambre = :Id_chambre, 
            Nom = :Nom, 
            Prix = :Prix, 
            Nbr_lit = :Nbr_lit, 
            Num_chambre = :Num_chambre, 
            Description = :Description, 
            Superficie = :Superficie, 
            Etat = :Etat,
            Id_type_chambre = :Id_type_chambre 
        WHERE Id_chambre = :Id_chambre";
        
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(':Id_chambre', $chambre->getId(), PDO::PARAM_STR);
        $stmt->bindValue(':Nom', $chambre->getNom(), PDO::PARAM_STR);
        $stmt->bindValue(':Prix', $chambre->getPrix(), PDO::PARAM_STR);
        $stmt->bindValue(':Nbr_lit', $chambre->getNbr_lit(), PDO::PARAM_STR);
        $stmt->bindValue(':Num_chambre', $chambre->getNum_chambre(), PDO::PARAM_STR);
        $stmt->bindValue(':Description', $chambre->getDescription(), PDO::PARAM_STR);
        $stmt->bindValue(':Superficie', $chambre->getSuperficie(), PDO::PARAM_STR);
        $stmt->bindValue(':Etat', $chambre->getEtat(), PDO::PARAM_STR);
        $stmt->bindValue(':Id_type_chambre', $chambre->getId_type_chambre()->getId(), PDO::PARAM_STR);
        return $stmt->execute();
    }


}
