<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

class Email
{
    private static $smtpServer = EMAIL_SMTP_HOST;
    private static $smtpPort = EMAIL_SMTP_PORT;
    private static $smtpSecure = EMAIL_SMTP_SECURE;
    private static $username = EMAIL_SMTP_USER;
    private static $password = EMAIL_SMTP_PASSWORD;
    private static $fromEmail = EMAIL_FROM_EMAIL;
    private static $fromName = EMAIL_FROM_NAME;
    private static $templateDir = DIR_TEMPLATE_EMAILS;

    /**
     * Envoie un email avec les paramètres spécifiés.
     *
     * @param string $to L'adresse email du destinataire.
     * @param string $name Le nom du destinataire.
     * @param string $subject Le sujet de l'email.
     * @param string $message Le message de l'email.
     * @return bool Retourne TRUE en cas de succès, FALSE sinon.
     */
    public static function send(array $_data): bool
    {
        
        $to = empty($_data["to"]) ? NULL : $_data["to"];
        $name = empty($_data["name"]) ? NULL : $_data["name"];
        $subject = empty($_data["subject"]) ? NULL : $_data["subject"];
        $template = empty($_data["template"]) ? NULL : $_data["template"];

        if(is_null($to) OR is_null($name) OR is_null($subject) OR is_null($template)){
            historique::recRef("script");
            historique::add(array(
                "idType" => historique::getIdRef("ERROR"),
                "idUser" => session::getId(),
                "idPage" => historique::getIdRef("script"),
                "log" => "L'email en erreur car toutes les valeurs ne sont pas présentes."
            ));
            return FALSE;
        }
        
        // Créer une instance de PHPMailer
        $mail = new PHPMailer(true);

        
        // Paramètres du serveur
        self::configureMailer($mail);

        // Si debug send email
        if(debug::isFile("send-email")){
            $mail->SMTPDebug = 2;
        }

        // Destinataires
        $mail->setFrom(self::$fromEmail, self::$fromName);
        $mail->addAddress($to, $name);

        $mail->CharSet = 'UTF-8';

        // Contenu de l'email
        $mail->isHTML(true);
        $mail->Subject = "CSE Invent :. ". $subject;
        $mail->Body    = $template;

        if(!debug::isFile("email")){
            try {
                $mail->send();
                return true;
            } catch (Exception $e) {
                $idSession = session::getId();
                if(empty($idSession)){
                    $idSession = NULL;
                }
    
                historique::recRef("script");
                historique::add(array(
                    "idType" => historique::getIdRef("ERROR"),
                    "idUser" => $idSession,
                    "idPage" => historique::getIdRef("script"),
                    "log" => $mail->ErrorInfo
                ));
                return false;
            }
        }
    }

    /**
     * Charge le template d'email spécifié.
     *
     * @param string $templateName Le nom du template à charger.
     * @return string|bool Le contenu du template ou FALSE en cas d'échec.
     */
    public static function loadTemplate(string $templateName)
    {
        $templatePath = self::$templateDir . $templateName;
        $template = file_get_contents($templatePath);

        return $template !== false ? $template : false;
    }

    /**
     * Configure les paramètres de PHPMailer.
     *
     * @param PHPMailer $mail L'instance de PHPMailer à configurer.
     */
    private static function configureMailer(PHPMailer $mail)
    {
        $mail->isSMTP();
        $mail->Host = self::$smtpServer;
        $mail->SMTPAuth = true;
        $mail->Username = self::$username;
        $mail->Password = self::$password;
        $mail->SMTPSecure = self::$smtpSecure;
        $mail->Port = self::$smtpPort;
    }
}