<?php

declare(strict_types = 1);

namespace MyApp\Model;

use MyApp\Entity\Facture;
use MyApp\Entity\Etablissement;
use PDO;

class Facture_Model{
    private PDO $db;

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

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

            $etablissement = null; 
            if ($row['Id_etablissement'] !== null) {
                $etablissement= new Etablissement($row['Id_etablissement'], $row['Nom_etablissement']);
            }
            $facture[] = new Facture($row['Id_facture'], floatval($row['Prix_total']), floatval($row['Prix_HT']), $row['Adresse_facturation'], $row['Mobilites_paiement'], $row['Date_facturation'], $row['Details_facturation'], $etablissement);
        }

        return $facture;
    }
    // methode pour récupérer un enregistrement de la table facture
    public function getOneFacture(int $id):?Facture{
        $sql = "SELECT Facture.*, Etablissement.* FROM Facture JOIN Etablissement ON Etablissement.Id_etablissement = Facture.Id_etablissement where Id_facture = :Id_facture";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(":Id_facture", $id);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if(!$row){
            return null;
        }
        $etablissement = null; 
        if ($row['Id_etablissement'] !== null) {
            $etablissement= new Etablissement($row['Id_etablissement'], $row['Num_telephone'], $row['Mail'], $row['Adresse'], $row['RIB']);
        }
        return new Facture($row['Id_facture'], floatval($row['Prix_total']), floatval($row['Prix_HT']), $row['Adresse_facturation'], $row['Mobilites_paiement'], $row['Date_facturation'], $row['Details_facturation'], $etablissement);
    }

    public function createFacture(Facture $facture): bool {
        $sql = "INSERT INTO Facture (Id_facture, Prix_total, Prix_HT, Adresse_facturation, Mobilites_paiement, Date_facturation, Details_facturation, Id_etablissement) 
                VALUES (:Id_facture, :Prix_total, :Prix_HT, :Adresse_facturation, :Mobilites_paiement, :Date_facturation, :Details_facturation, :Id_etablissement)";
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue(':Id_facture', $facture->getId(), PDO::PARAM_STR);
        $stmt->bindValue(':Prix_total', $facture->getPrix_total(), PDO::PARAM_STR);
        $stmt->bindValue(':Prix_HT', $facture->getPrix_ht(), PDO::PARAM_STR);
        $stmt->bindValue(':Adresse_facturation', $facture->getAdresse(), PDO::PARAM_STR);
        $stmt->bindValue(':Mobilites_paiement', $facture->getMobilites_paiement(), PDO::PARAM_STR);
        $stmt->bindValue(':Date_facturation', $facture->getDate_facturation(), PDO::PARAM_STR);
        $stmt->bindValue(':Details_facturation', $facture->getDetails_facturation(), PDO::PARAM_STR);
        $stmt->bindValue(':Id_etablissement', $facture->getId_etablissement(), PDO::PARAM_INT); // Met une valeur null si neccesaire
        return $stmt->execute();
    }

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

    public function getLastFactureId() {
    
        // Requête SQL avec une déclaration préparée pour récupérer le dernier ID de la table Facture
        $sql = "SELECT MAX(Id_facture) AS Dernier_Id_facture FROM Facture";
        $stmt = $this->db->prepare($sql);
        
        // Exécution de la déclaration préparée
        $stmt->execute();
        
        // Récupération du résultat
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if(!$row){
            return null;
        }
        
        // Retourner le dernier ID de la table Facture
        return $row["Dernier_Id_facture"];
    
    }        

}
