<?php
/**
 * Twitter RSS to Database - Automated Cronjob
 * Fetches Twitter posts from RSS.app feed and inserts into database
 * Run: php twitter-cronjob.php or via cronjob
 */

// إعداد البيئة
set_time_limit(0);
ini_set('max_execution_time', 600);
ini_set('memory_limit', '512M');
error_reporting(E_ALL);
ini_set('display_errors', 0); // تعطيل العرض للـ cronjob
date_default_timezone_set('Africa/Cairo');
include "../inc/con.php";

// ============================================
// إعدادات RSS
// ============================================
$rss_url = 'https://rss.app/feeds/v1.1/Ptx5ZepR8310RT9O.json';

// ============================================
// إعدادات المجلدات
// ============================================

// المجلدات في نفس مجلد api
$uploads_dir = __DIR__ . '/upload/';        // للصور
$media_dir = __DIR__ . '/upload_media/';    // للفيديوهات

// إنشاء المجلدات إذا لم تكن موجودة
if (!is_dir($uploads_dir))
    mkdir($uploads_dir, 0755, true);
if (!is_dir($media_dir))
    mkdir($media_dir, 0755, true);

// ============================================
// بدء التنفيذ
// ============================================
$startTime = microtime(true);
$logMessages = [];

function logMessage($message, $type = 'INFO')
{
    global $logMessages;
    $timestamp = date('Y-m-d H:i:s');
    $logMessages[] = "[$timestamp][$type] $message";
    echo "[$timestamp][$type] $message\n";
}

logMessage("Starting Twitter RSS Cronjob<BR>");

// التحقق من الاتصال بقاعدة البيانات
if (!isset($db)) {
    logMessage("<BR>Database connection not available<BR>", "ERROR");
    exit(1);
}
logMessage("<BR>Database connected successfully<BR>");

/**
 * تحويل التاريخ إلى توقيت القاهرة بصيغة MySQL
 */
function convertToEgyptTime($dateString)
{
    try {
        $date = new DateTime($dateString, new DateTimeZone('UTC'));
        $date->setTimezone(new DateTimeZone('Africa/Cairo'));
        return $date->format('Y-m-d H:i:s');
    } catch (Exception $e) {
        return date('Y-m-d H:i:s');
    }
}

function cleanTwitterLinks($text)
{
    if (empty($text)) {
        return $text;
    }

    // البحث عن أول رابط تويتر وحذف كل شيء من بدايته حتى نهاية النص
    $cleaned = preg_replace('/twitter\.com\/.*$/us', '', $text);

    // تنظيف المسافات الزائدة من النهاية
    $cleaned = rtrim($cleaned);

    // تنظيف أي أسطر فارغة من النهاية
    $cleaned = preg_replace('/\s+$/u', '', $cleaned);

    return $cleaned;
}

/**
 * تنزيل ملف من رابط
 */
function downloadFile($url)
{
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT => 60,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    ]);

    $data = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return ($data !== false && $httpCode === 200) ? $data : false;
}

/**
 * حفظ ملف على السيرفر
 */
function saveFile($data, $directory, $filename)
{
    if (!is_dir($directory)) {
        mkdir($directory, 0755, true);
    }

    $filepath = $directory . $filename;
    return file_put_contents($filepath, $data) !== false ? $filename : false;
}

/**
 * استخراج Tweet ID من الرابط
 */
function getTweetId($tweetUrl)
{
    preg_match('/status\/(\d+)/', $tweetUrl, $matches);
    return $matches[1] ?? uniqid();
}

/**
 * إزالة كلمة pic من النص
 */
function removePicWord($text)
{
    // إزالة "pic" و "pic." و "pic:" وأي اختلافات
    $text = preg_replace('/\bpic\.?\s*/i', '', $text);
    $text = preg_replace('/\bpic\b/i', '', $text);
    return trim($text);
}

/**
 * استخراج رابط الفيديو من تويتر
 */
function getTwitterVideoUrl($tweetUrl)
{
    preg_match('/status\/(\d+)/', $tweetUrl, $matches);
    if (empty($matches[1])) {
        return false;
    }

    $apiUrl = "https://twitsave.com/info?url=" . urlencode($tweetUrl);

    try {
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $apiUrl,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        ]);

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($response === false || $httpCode !== 200) {
            logMessage("<BR>TwitSave API failed with code: $httpCode", "WARNING");
            return false;
        }

        // البحث عن روابط mp4 بجودات مختلفة
        preg_match_all('/(https?:\/\/[^\s"\'<>]+\.mp4[^\s"\'<>]*)/i', $response, $videoMatches);

        if (!empty($videoMatches[1])) {
            logMessage("<BR>Found " . count($videoMatches[1]) . " video URLs", "INFO");
            // اختيار أول رابط (عادة يكون بأعلى جودة)
            return $videoMatches[1][0];
        }

        logMessage("<BR>No .mp4 URLs found in TwitSave response", "WARNING");
        return false;

    } catch (Exception $e) {
        logMessage("<BR><BR>Error extracting video: " . $e->getMessage(), "ERROR");
        return false;
    }
}

/**
 * فحص إذا كانت التغريدة تحتوي على فيديو
 * نحاول تحميل الفيديو من كل البوستات لأن Twitter بيحط صورة thumbnail حتى للفيديوهات
 */
function hasVideo($contentHtml, $attachments = [])
{
    // التحقق من وجود كلمة video في المحتوى
    if (stripos($contentHtml, 'video') !== false) {
        return true;
    }

    // نحاول تحميل الفيديو من كل البوستات التي تحتوي على روابط Twitter
    if (strpos($contentHtml, 'pic.twitter.com') !== false || strpos($contentHtml, 't.co') !== false) {
        return true;
    }

    return false;
}

/**
 * التحقق من وجود المنشور
 */
function postExists($db, $tweetUrl)
{
    try {
        $tweetId = getTweetId($tweetUrl);
        $stmt = $db->prepare("SELECT COUNT(*) FROM social_media_content WHERE post_id = ?");
        $stmt->execute([$tweetId]);
        return $stmt->fetchColumn() > 0;
    } catch (PDOException $e) {
        return false;
    }
}

/**
 * معالجة المرفقات وتحميل الفيديو
 * يستخدم post_id (tweetId) في تسمية الملفات
 */
function processMedia($attachments, $uploads_dir, $media_dir, $tweetUrl, $contentHtml, $tweetId)
{
    $photoFile = null;
    $videoFile = null;

    // معالجة الصور - نأخذ أول صورة فقط
    if (!empty($attachments)) {
        logMessage("<BR><BR>Found " . count($attachments) . " attachment(s)");

        // تحميل أول صورة فقط
        $firstAttachment = $attachments[0];
        $url = $firstAttachment['url'] ?? '';

        if (!empty($url)) {
            $parsedUrl = parse_url($url);
            $pathInfo = pathinfo($parsedUrl['path']);
            $extension = $pathInfo['extension'] ?? 'jpg';

            // اسم الملف = post_id.jpg
            $filename = $tweetId . '.' . $extension;

            logMessage("<BR><BR>Downloading image: $filename");

            $fileData = downloadFile($url);
            if ($fileData !== false) {
                $saved = saveFile($fileData, $uploads_dir, $filename);
                if ($saved) {
                    $photoFile = $filename;
                    logMessage("<BR>Image saved: $filename", "SUCCESS");
                } else {
                    logMessage("<BR>Failed to save image", "ERROR");
                }
            } else {
                logMessage("<BR>Failed to download image", "WARNING");
            }
        }
    }

    // محاولة تحميل الفيديو
    if (hasVideo($contentHtml, $attachments)) {
        logMessage("<BR><BR>Detecting video in tweet...");

        $videoUrl = getTwitterVideoUrl($tweetUrl);

        if ($videoUrl) {
            logMessage("<BR><BR>Video URL found: $videoUrl");
            logMessage("<BR>Downloading video...");

            // اسم الملف = post_id.mp4
            $filename = $tweetId . '.mp4';
            $videoData = downloadFile($videoUrl);

            if ($videoData !== false) {
                $saved = saveFile($videoData, $media_dir, $filename);
                if ($saved) {
                    $videoFile = $filename;
                    logMessage("<BR>Video saved successfully: $filename", "SUCCESS");
                } else {
                    logMessage("<BR>Failed to save video file", "ERROR");
                }
            } else {
                logMessage("<BR>Failed to download video from URL", "WARNING");
            }
        } else {
            logMessage("<BR>Could not extract video URL from TwitSave", "WARNING");
        }
    }

    return [
        'photo' => $photoFile,
        'video' => $videoFile
    ];
}

/**
 * تحديد نوع المحتوى
 */
function getContentType($hasPhoto, $hasVideo)
{
    if ($hasVideo) {
        return 10; // فيديو
    } elseif ($hasPhoto) {
        return 1; // صورة واحدة
    }
    return 1; // افتراضي
}

/**
 * إدخال البيانات في قاعدة البيانات
 * ترجع ID السجل المُضاف أو false في حالة الفشل
 */
function insertPost($db, $postData)
{
    try {
        $sql = "INSERT INTO social_media_content (
            post_id,
            url,
            title, 
            content_text,
            content_html,
            photo,
            attachments,
            video_url,
            cat_sources,
            cat_id,
            content_type,
            status,
            lang,
            publish_date, 
            create_date, 
            last_update_date
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

        $stmt = $db->prepare($sql);
        $success = $stmt->execute([
            $postData['post_id'],
            $postData['url'],
            cleanTwitterLinks($postData['title']),
            $postData['content_text'],
            $postData['content_html'],
            $postData['photo'],
            $postData['attachments'],
            $postData['video_url'],
            $postData['cat_sources'],
            $postData['cat_id'],
            $postData['content_type'],
            $postData['status'],
            $postData['lang'],
            $postData['publish_date'],
            $postData['create_date'],
            $postData['last_update_date']
        ]);

        if ($success) {
            return $db->lastInsertId(); // إرجاع ID السجل المُضاف
        }
        return false;
    } catch (PDOException $e) {
        logMessage("<BR>Database insert error: " . $e->getMessage(), "ERROR");
        return false;
    }
}

/**
 * تحديث الصورة والفيديو بعد الإضافة
 */
function updateMedia($db, $recordId, $photo, $videoUrl)
{
    try {
        $sql = "UPDATE social_media_content SET photo = ?, video_url = ? WHERE id = ?";
        $stmt = $db->prepare($sql);
        return $stmt->execute([$photo, $videoUrl, $recordId]);
    } catch (PDOException $e) {
        logMessage("<BR>Failed to update media: " . $e->getMessage(), "ERROR");
        return false;
    }
}

// ============================================
// جلب ومعالجة البيانات
// ============================================

logMessage("Fetching RSS data from: $rss_url");

$jsonData = downloadFile($rss_url);

if ($jsonData === false) {
    logMessage("<BR>Failed to fetch RSS data", "ERROR");
    exit(1);
}

$data = json_decode($jsonData, true);

if ($data === null || !isset($data['items'])) {
    logMessage("<BR>Invalid JSON data", "ERROR");
    exit(1);
}

$totalItems = count($data['items']);
logMessage("Found $totalItems posts to process");

// عدادات
$processedCount = 0;
$insertedCount = 0;
$existingCount = 0;
$errorCount = 0;

// معالجة كل منشور
foreach ($data['items'] as $index => $item) {
    $processedCount++;

    $title = removePicWord($item['title'] ?? 'بلا عنوان');
    $content_text = removePicWord($item['content_text'] ?? '');
    $content_html = $item['content_html'] ?? '';
    $date_published = $item['date_published'] ?? date('c');
    $attachments = $item['attachments'] ?? [];
    $tweetUrl = $item['url'] ?? '';
    $content_html = cleanTwitterLinks($content_html);
    $content_text = cleanTwitterLinks($content_text);
    $title = cleanTwitterLinks($title);

    $tweetId = getTweetId($tweetUrl);

    logMessage("<BR>Processing post $processedCount/$totalItems - Tweet ID: $tweetId");

    // التحقق من وجود المنشور
    if (postExists($db, $tweetUrl)) {
        logMessage("<BR>Post already exists, skipping...", "WARNING");
        $existingCount++;
        continue;
    }

    // تحويل التاريخ
    $mysqlDate = convertToEgyptTime($date_published);

    // تحضير البيانات للإدخال (بدون ميديا في البداية)
    $postData = [
        'post_id' => $tweetId,
        'url' => $tweetUrl,
        'title' => mb_substr($title, 0, 500, 'UTF-8'),
        'content_text' => $content_text,
        'content_html' => $content_html,
        'photo' => '', // سيتم تحديثه لاحقاً
        'attachments' => json_encode($attachments, JSON_UNESCAPED_UNICODE),
        'video_url' => '', // سيتم تحديثه لاحقاً
        'cat_sources' => 1, // المصدر: 1 = Twitter/X (يرتبط بجدول cat_sources)
        'cat_id' => 34,
        'content_type' => 1, // سيتم تحديثه بعد معرفة نوع الميديا
        'status' => 1,
        'lang' => 'ar',
        'publish_date' => $mysqlDate,
        'create_date' => $mysqlDate,
        'last_update_date' => $mysqlDate
    ];

    // إدخال في قاعدة البيانات والحصول على ID
    $recordId = insertPost($db, $postData);

    if ($recordId) {
        logMessage("<BR>Post inserted with ID: $recordId", "SUCCESS");

        // الآن نحمل الملفات باستخدام tweetId (post_id)
        $mediaFiles = processMedia($attachments, $uploads_dir, $media_dir, $tweetUrl, $content_html, $tweetId);

        // تحديد نوع المحتوى
        $hasVideo = !empty($mediaFiles['video']);
        $hasPhoto = !empty($mediaFiles['photo']);
        $contentType = getContentType($hasPhoto, $hasVideo);

        // تحديث السجل بالميديا ونوع المحتوى
        $updateSql = "UPDATE social_media_content SET photo = ?, video_url = ?, content_type = ? WHERE id = ?";
        $stmt = $db->prepare($updateSql);
        $stmt->execute([
            $hasPhoto ? $mediaFiles['photo'] : '',
            $hasVideo ? $mediaFiles['video'] : '',
            $contentType,
            $recordId
        ]);

        $insertedCount++;
        logMessage("<BR>Post completed - Type: $contentType", "SUCCESS");
    } else {
        $errorCount++;
        logMessage("<BR>Failed to insert post", "ERROR");
    }

    // تأخير بسيط
    usleep(500000); // 0.5 second
}

// ============================================
// الملخص النهائي
// ============================================

$endTime = microtime(true);
$executionTime = round($endTime - $startTime, 2);

logMessage(" <BR>==================================== <BR>");
logMessage(" <BR> CRONJOB EXECUTION SUMMARY  <BR>");
logMessage(" <BR> ====================================  <BR>");
logMessage(" <BR>Total posts found: $totalItems");
logMessage(" <BR>Posts processed: $processedCount");
logMessage(" <BR>New posts inserted: $insertedCount");
logMessage(" <BR>Existing posts skipped: $existingCount");
logMessage(" <BR>Errors: $errorCount");
logMessage(" <BR>Execution time: {$executionTime}s");
logMessage(" <BR>==================================== <BR>");

// حفظ السجل في ملف
$logEntry = implode("\n", $logMessages) . "\n\n";
@file_put_contents(__DIR__ . '/twitter_cronjob.log', $logEntry, FILE_APPEND | LOCK_EX);

// كود الخروج
exit($errorCount > 0 ? 1 : 0);
?>