<?php
/**
 * 🔔 سیستم یادآوری انقضای سرویس
 * این worker باید هر روز یکبار اجرا شود (مثلا با cron job)
 * 
 * نحوه اجرا با cron:
 * 0 9 * * * /usr/bin/php /path/to/worker/expiry_reminder_worker.php
 * (هر روز ساعت ۹ صبح اجرا می‌شود)
 */

declare(strict_types=1);
require __DIR__ . '/../src/config.php';

$pdo = db();

error_log("🔔 ════════════════════════════════════════════════");
error_log("🔔 Service Expiry Reminder Worker Started");
error_log("🔔 Time: " . date('Y-m-d H:i:s'));
error_log("🔔 ════════════════════════════════════════════════");

try {
    // ۱) یادآوری ۲ روز قبل
    send_reminders_for_type('2_DAYS', 2);
    
    // ۲) یادآوری ۱ روز قبل
    send_reminders_for_type('1_DAY', 1);
    
    // ۳) یادآوری روز انقضا
    send_reminders_for_type('EXPIRED', 0);
    
    error_log("✅ Expiry reminder worker completed successfully");
    
} catch (Exception $e) {
    error_log("❌ Error in expiry reminder worker: " . $e->getMessage());
}

/**
 * ارسال یادآورها برای یک نوع خاص
 */
function send_reminders_for_type($reminder_type, $days_before) {
    global $pdo;
    
    error_log("🔍 Processing reminders for type: {$reminder_type} (days_before: {$days_before})");
    
    // محاسبه تاریخ هدف
    $target_date = date('Y-m-d', strtotime("+{$days_before} days"));
    
    // پیدا کردن سرویس‌هایی که در تاریخ هدف منقضی می‌شوند و یادآور ارسال نشده
    $sql = "
        SELECT s.*, u.first_name, u.username
        FROM sales s
        JOIN users u ON s.user_id = u.id
        LEFT JOIN service_expiry_reminders r ON s.id = r.sale_id AND r.reminder_type = :reminder_type
        WHERE DATE(s.expires_at) = :target_date
        AND s.is_active = 1
        AND s.expires_at IS NOT NULL
        AND r.id IS NULL
        ORDER BY s.id ASC
    ";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':reminder_type' => $reminder_type,
        ':target_date' => $target_date
    ]);
    
    $services = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    error_log("📊 Found " . count($services) . " services to remind for {$reminder_type}");
    
    if (empty($services)) {
        return;
    }
    
    $success_count = 0;
    $failed_count = 0;
    
    foreach ($services as $service) {
        try {
            $sent = send_expiry_reminder($service, $reminder_type, $days_before);
            
            if ($sent) {
                // ثبت یادآور در دیتابیس
                $insert_stmt = $pdo->prepare("
                    INSERT INTO service_expiry_reminders (sale_id, user_id, reminder_type, sent_at)
                    VALUES (:sale_id, :user_id, :reminder_type, NOW())
                ");
                $insert_stmt->execute([
                    ':sale_id' => $service['id'],
                    ':user_id' => $service['user_id'],
                    ':reminder_type' => $reminder_type
                ]);
                
                $success_count++;
                error_log("✅ Reminder sent for service #{$service['id']} to user {$service['user_id']}");
            } else {
                $failed_count++;
                error_log("❌ Failed to send reminder for service #{$service['id']}");
            }
            
            // تاخیر کوتاه برای جلوگیری از محدودیت‌های تلگرام
            usleep(100000); // 0.1 ثانیه
            
        } catch (Exception $e) {
            $failed_count++;
            error_log("❌ Error sending reminder for service #{$service['id']}: " . $e->getMessage());
        }
    }
    
    error_log("📈 Reminders for {$reminder_type}: Success={$success_count}, Failed={$failed_count}");
}

/**
 * ارسال یادآور انقضا به کاربر
 */
function send_expiry_reminder($service, $reminder_type, $days_before) {
    // ساخت پیام بر اساس نوع یادآور
    $emoji_map = [
        '2_DAYS' => '⏰',
        '1_DAY' => '⚠️',
        'EXPIRED' => '🔴'
    ];
    
    $emoji = $emoji_map[$reminder_type] ?? '🔔';
    
    // متن پیام
    if ($days_before == 2) {
        $title = "🔔 یادآوری: ۲ روز تا پایان سرویس";
        $message = "سرویس شما **۲ روز** دیگر منقضی می‌شود!";
    } elseif ($days_before == 1) {
        $title = "⚠️ هشدار: ۱ روز تا پایان سرویس";
        $message = "سرویس شما **فردا** منقضی می‌شود!";
    } else {
        $title = "🔴 اخطار: سرویس امروز منقضی می‌شود!";
        $message = "سرویس شما **امروز** به پایان می‌رسد!";
    }
    
    $text = "{$emoji} **{$title}**\n\n";
    $text .= "━━━━━━━━━━━━━━━━━━━━\n";
    $text .= "📦 **پلن:** {$service['plan_title']}\n";
    $text .= "💰 **مبلغ:** " . number_format($service['price']) . " تومان\n";
    $text .= "📅 **تاریخ انقضا:** " . date('Y/m/d', strtotime($service['expires_at'])) . "\n";
    $text .= "━━━━━━━━━━━━━━━━━━━━\n\n";
    $text .= "💡 {$message}\n\n";
    $text .= "✨ برای تمدید یا خرید سرویس جدید از دکمه زیر استفاده کنید:";
    
    // کیبورد با دکمه خرید
    $keyboard = [
        'inline_keyboard' => [
            [
                ['text' => '🛒 خرید سرویس جدید', 'callback_data' => 'BUY']
            ],
            [
                ['text' => '📦 سرویس‌های من', 'callback_data' => 'MY_SERVICES'],
                ['text' => '💰 کیف پول', 'callback_data' => 'WALLET']
            ]
        ]
    ];
    
    // ارسال پیام
    $result = tg('sendMessage', [
        'chat_id' => $service['user_id'],
        'text' => $text,
        'parse_mode' => 'Markdown',
        'reply_markup' => json_encode($keyboard, JSON_UNESCAPED_UNICODE)
    ]);
    
    return ($result && isset($result['ok']) && $result['ok'] === true);
}

error_log("🔔 ════════════════════════════════════════════════");
error_log("🔔 Worker execution completed");
error_log("🔔 ════════════════════════════════════════════════");

