<?php

use App\Models\Users;
use App\Models\Avance;
use App\Models\AlertMail;

function checkDeadlineAlerts()
{
    log_message('info', "=== DÉBUT checkDeadlineAlerts ===");
    
    $cacheFile = WRITEPATH . 'cache/check_deadline_last_run.txt';

    // On enlève la vérification de 24h pour s'assurer que le script tourne quotidiennement
    file_put_contents($cacheFile, time());

    $avanceModel = new Avance();
    $alertMailModel = new AlertMail();
    $usersModel = new Users();

    $today = date('Y-m-d');
    log_message('info', "Date du jour: {$today}");

    // Modification pour vérifier les avances dans 0-3 jours
    $avances = $avanceModel
        ->where('DATE(deadline) >=', $today) // Inclut le jour même
        ->where('DATE(deadline) <=', date('Y-m-d', strtotime('+3 days')))
        ->where('active', 1)
        ->findAll();

    log_message('info', "Nombre d'avances trouvées (0-3 jours): " . count($avances));

    $users = $usersModel->select('users.email, users.firstname, users.lastname')
        ->join('user_group', 'user_group.user_id = users.id')
        ->join('groups', 'groups.id = user_group.group_id')
        ->where('groups.group_name', 'DAF')
        ->findAll();
    
    log_message('info', "Utilisateurs DAF trouvés: " . json_encode($users));

    $emails = array_column($users, 'email');
    log_message('info', "Emails extraits: " . json_encode($emails));

    if (empty($emails)) {
        log_message('error', "Aucun email DAF trouvé");
        
        $db = \Config\Database::connect();
        $allGroups = $db->query("SELECT DISTINCT group_name FROM groups")->getResult();
        log_message('info', "Groupes disponibles: " . json_encode($allGroups));
        
        return;
    }

    foreach ($avances as $avance) {
        $deadline = date('Y-m-d', strtotime($avance['deadline']));
        $daysLeft = (int) ceil((strtotime($deadline) - strtotime($today)) / 86400);

        log_message('info', "Avance ID: {$avance['avance_id']}, Deadline: {$deadline}, Jours restants: {$daysLeft}");

        // Modification des types d'alerte pour 0, 1, 2, 3 jours
        $alertType = match($daysLeft) {
            3 => 'deadline_3_days',
            2 => 'deadline_2_days',
            1 => 'deadline_1_day',
            0 => 'deadline_today',
            default => null,
        };

        if ($alertType === null) {
            log_message('info', "Pas d'alerte nécessaire pour {$daysLeft} jours restants");
            continue;
        }

        log_message('info', "Type d'alerte: {$alertType}");

        // Vérification si l'alerte a déjà été envoyée
        $alreadySent = $alertMailModel
            ->where('avance_id', $avance['avance_id'])
            ->where('alert_type', $alertType)
            ->first();

        if ($alreadySent) {
            log_message('info', "Alerte déjà envoyée pour avance_id={$avance['avance_id']} type={$alertType}");
            continue;
        }

        // Message modifié pour inclure le cas du jour même
        $urgencyText = $daysLeft === 0 ? "ÉCHÉANCE AUJOURD'HUI" : "{$daysLeft} jour(s) restant(s)";
        $message = "
            <h3>⚠️ URGENT : Avance approchant de la deadline</h3>
            <p><strong>ID Avance :</strong> {$avance['avance_id']}</p>
            <p><strong>Client :</strong> {$avance['customer_name']}</p>
            <p><strong>Montant avance :</strong> " . number_format($avance['avance_amount'], 0, ',', ' ') . " Ar</p>
            <p><strong>Montant dû :</strong> " . number_format($avance['amount_due'], 0, ',', ' ') . " Ar</p>
            <p><strong>Deadline :</strong> {$deadline}</p>
            <p><strong>Statut :</strong> <span style='color: red; font-weight: bold;'>{$urgencyText}</span></p>
            <p><strong>Téléphone client :</strong> {$avance['customer_phone']}</p>
            <p><strong>Adresse client :</strong> {$avance['customer_address']}</p>
            <hr>
            <p><em>Cette avance " . ($daysLeft === 0 ? "arrive à échéance aujourd'hui" : "arrivera à échéance dans {$daysLeft} jour(s)") . ". Action requise immédiatement.</em></p>
        ";

        $emailsSent = 0;
        foreach ($emails as $to) {
            log_message('info', "Tentative d'envoi email à: {$to}");
            
            $subject = $daysLeft === 0 
                ? "⚠️ AVANCE URGENTE - ÉCHÉANCE AUJOURD'HUI" 
                : "⚠️ AVANCE URGENTE - {$daysLeft} jour(s) restant(s)";

            if (sendEmailInBackground($to, $subject, $message)) {
                $emailsSent++;
                log_message('info', "Email envoyé avec succès à: {$to}");
            } else {
                log_message('error', "Échec envoi email à: {$to}");
            }
        }

        if ($emailsSent > 0) {
            log_message('info', "Insertion alerte pour avance_id={$avance['avance_id']} avec type {$alertType}");
            $alertMailModel->insert([
                'avance_id' => $avance['avance_id'],
                'alert_type' => $alertType,
                'sent_date' => date('Y-m-d H:i:s'),
                'status' => 'sent',
                'created_at' => date('Y-m-d H:i:s'),
            ]);
        } else {
            log_message('error', "Aucun email envoyé pour avance_id={$avance['avance_id']} avec type {$alertType}");
        }
    }
    
    log_message('info', "=== FIN checkDeadlineAlerts ===");
}

function sendEmailInBackground($to, $subject, $message)
{
    try {
        log_message('info', "Préparation envoi email à: {$to}");
        
        $email = \Config\Services::email();

        $config = [
            'protocol' => 'smtp',
            'SMTPHost' => 'smtp.gmail.com',
            'SMTPUser' => 'rey342505@gmail.com',
            'SMTPPass' => 'loirqovmfuxnasrm',
            'SMTPPort' => 587,
            'SMTPCrypto' => 'tls',
            'mailType' => 'html',
            'charset' => 'utf-8',
            'newline' => "\r\n"
        ];

        $email->initialize($config);

        $email->setFrom('rey342505@gmail.com', 'Système Motorbike - Alertes Avances');
        $email->setTo($to);
        $email->setSubject($subject);
        $email->setMessage($message);

        log_message('info', "Configuration email terminée, tentative d'envoi...");

        if (!$email->send()) {
            $debugInfo = $email->printDebugger(['headers']);
            log_message('error', "Erreur email à {$to}: " . print_r($debugInfo, true));
            return false;
        }
        
        log_message('info', "Email envoyé avec succès à: {$to}");
        return true;
        
    } catch (\Exception $e) {
        log_message('error', "Exception email à {$to}: " . $e->getMessage());
        return false;
    }
}