<?php
/**
 * Fonction d'envoi d'email pour les notifications d'expiration
 */

require_once __DIR__ . '/../PHPMailer/src/Exception.php';
require_once __DIR__ . '/../PHPMailer/src/PHPMailer.php';
require_once __DIR__ . '/../PHPMailer/src/SMTP.php';
require_once __DIR__ . '/email_template.php';

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

/**
 * Configuration email - À personnaliser selon votre serveur SMTP
 */
class EmailConfig {
    const SMTP_HOST = 'mail.services-ae.net'; // Même configuration que forgot-password.php
    const SMTP_PORT = 465;
    const SMTP_USERNAME = 'manager@hebergood.com'; // Même configuration que forgot-password.php
    const SMTP_PASSWORD = 'X!P0}h=HwhA*'; // Même configuration que forgot-password.php
    const FROM_EMAIL = 'manager@hebergood.com'; // Même configuration que forgot-password.php
    const FROM_NAME = 'Hiba Assurance'; // Nom de votre compagnie
    const REPLY_TO = 'manager@hebergood.com'; // Même configuration que forgot-password.php
}

/**
 * Envoie un email de notification d'expiration
 */
function sendExpirationEmail($to_email, $client_name, $policy_number, $end_date, $days_remaining, $montant_to_paie) {
    $mail = new PHPMailer(true);
    
    try {        // Configuration du serveur
        $mail->isSMTP();
        $mail->Host = EmailConfig::SMTP_HOST;
        $mail->SMTPAuth = true;
        $mail->Username = EmailConfig::SMTP_USERNAME;
        $mail->Password = EmailConfig::SMTP_PASSWORD;
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // Même configuration que forgot-password.php
        $mail->Port = EmailConfig::SMTP_PORT;
        $mail->CharSet = 'UTF-8';
        
        // Destinataires
        $mail->setFrom(EmailConfig::FROM_EMAIL, EmailConfig::FROM_NAME);
        $mail->addAddress($to_email, $client_name);
        $mail->addReplyTo(EmailConfig::REPLY_TO, EmailConfig::FROM_NAME);
        
        // Contenu
        $mail->isHTML(true);
        $mail->Subject = '🛡️ Rappel: Votre police d\'assurance expire dans ' . $days_remaining . ' jour(s) - Police #' . $policy_number;
        
        // Template HTML
        $mail->Body = getEmailTemplate($client_name, $policy_number, $end_date, $days_remaining, $montant_to_paie);
        
        // Version texte alternative
        $mail->AltBody = getEmailTextTemplate($client_name, $policy_number, $end_date, $days_remaining, $montant_to_paie);
        
        // Envoi
        $mail->send();
        return [
            'success' => true,
            'message' => 'Email envoyé avec succès'
        ];
        
    } catch (Exception $e) {
        return [
            'success' => false,
            'message' => 'Erreur lors de l\'envoi de l\'email: ' . $mail->ErrorInfo,
            'error' => $e->getMessage()
        ];
    }
}

/**
 * Envoie un email de test pour vérifier la configuration
 */
function sendTestEmail($to_email = null) {
    if (!$to_email) {
        $to_email = EmailConfig::REPLY_TO;
    }
    
    $result = sendExpirationEmail(
        $to_email,
        'Client Test',
        'TEST-2024-001',
        date('Y-m-d', strtotime('+15 days')),
        15,
        1500.00
    );
    
    return $result;
}

/**
 * Valide une adresse email
 */
function isValidEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

/**
 * Log l'envoi d'email dans la base de données
 */
function logEmailSent($conn, $policy_id, $client_cin, $email, $success, $message = '', $notification_type = 'EMAIL') {
    $status = $success ? 'sent' : 'failed';
    $current_time = date('Y-m-d H:i:s');
    
    $query = "INSERT INTO notification_log (policy_id, client_cin, notification_type, status, sent_at, message, phone_email) 
              VALUES (?, ?, ?, ?, ?, ?, ?)";
    
    $stmt = $conn->prepare($query);
    if ($stmt) {
        $stmt->bind_param("issssss", $policy_id, $client_cin, $notification_type, $status, $current_time, $message, $email);
        $result = $stmt->execute();
        $stmt->close();
        return $result;
    }
    
    return false;
}

/**
 * Fonction sendEmail() générique pour compatibility
 */
function sendEmail($to_email, $subject, $html_body, $alt_body = '') {
    // Validation de l'email
    if (!filter_var($to_email, FILTER_VALIDATE_EMAIL)) {
        return [
            'success' => false,
            'error' => 'Adresse email invalide: ' . $to_email,
            'message' => 'Email invalide'
        ];
    }

    $mail = new PHPMailer(true);
    
    try {
        // Configuration du serveur avec paramètres optimisés
        $mail->isSMTP();
        $mail->Host = EmailConfig::SMTP_HOST;
        $mail->SMTPAuth = true;
        $mail->Username = EmailConfig::SMTP_USERNAME;
        $mail->Password = EmailConfig::SMTP_PASSWORD;
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
        $mail->Port = EmailConfig::SMTP_PORT;
        $mail->CharSet = 'UTF-8';
        
        // Paramètres de performance et fiabilité
        $mail->Timeout = 30; // Timeout de 30 secondes
        $mail->SMTPKeepAlive = false; // Fermer la connexion après chaque envoi
        $mail->SMTPOptions = [
            'ssl' => [
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
            ]
        ];
        
        // Destinataires
        $mail->setFrom(EmailConfig::FROM_EMAIL, EmailConfig::FROM_NAME);
        $mail->addAddress($to_email);
        $mail->addReplyTo(EmailConfig::REPLY_TO, EmailConfig::FROM_NAME);
        
        // Contenu
        $mail->isHTML(true);
        $mail->Subject = $subject;
        $mail->Body = $html_body;
        
        if ($alt_body) {
            $mail->AltBody = $alt_body;
        } else {
            // Générer une version texte automatiquement
            $mail->AltBody = strip_tags(str_replace(['<br>', '<br/>', '<br />'], "\n", $html_body));
        }
        
        // Envoi avec gestion d'erreur détaillée
        if ($mail->send()) {
            return [
                'success' => true,
                'message' => 'Email envoyé avec succès à ' . $to_email
            ];
        } else {
            return [
                'success' => false,
                'error' => 'Échec de l\'envoi: ' . $mail->ErrorInfo,
                'message' => 'Erreur SMTP'
            ];
        }
        
    } catch (Exception $e) {
        // Log détaillé de l'erreur
        $error_details = [
            'Exception' => $e->getMessage(),
            'ErrorInfo' => $mail->ErrorInfo ?? 'Non défini',
            'To' => $to_email,
            'Host' => EmailConfig::SMTP_HOST,
            'Port' => EmailConfig::SMTP_PORT,
            'Username' => EmailConfig::SMTP_USERNAME
        ];
        
        return [
            'success' => false,
            'error' => 'Exception PHPMailer: ' . $e->getMessage(),
            'message' => 'Erreur technique: ' . $mail->ErrorInfo,
            'details' => $error_details
        ];
    } finally {
        // Nettoyage des connexions
        if ($mail->getSMTPInstance()) {
            $mail->smtpClose();
        }
    }
}
?>
