<?php
/**
 * تنبيهات تشغيلية: طلبات قديمة بلا إنجاز، نتائج حرجة غير معتمدة
 * جدولة: كل ساعة — php scripts/lab_ops_alerts_cron.php
 */
$config = require __DIR__ . '/../config/config.php';
require_once __DIR__ . '/../src/Core/Database.php';

use App\Core\Database;

date_default_timezone_set($config['timezone'] ?? 'UTC');
$db = Database::getInstance($config['db'])->connection();

function logOps(PDO $db, int $tenantId, string $type, string $message, ?string $ref = null): void
{
    try {
        $db->query('SELECT id FROM lab_ops_alert_log LIMIT 1');
        $db->prepare('INSERT INTO lab_ops_alert_log (tenant_id, alert_type, message, entity_ref) VALUES (?,?,?,?)')
            ->execute([$tenantId, $type, $message, $ref]);
    } catch (Throwable $e) {
        error_log('lab_ops_alerts_cron log: ' . $e->getMessage());
    }
}

try {
    $tenants = $db->query("SELECT id FROM tenants WHERE status IN ('active','trial')")->fetchAll(PDO::FETCH_COLUMN);
} catch (Throwable $e) {
    $tenants = [1];
}

foreach ($tenants as $tid) {
    $tenantId = (int)$tid;
    // طلبات بقيت pending لأكثر من 48 ساعة
    try {
        $stmt = $db->prepare(
            "SELECT COUNT(DISTINCT o.id) FROM order_items oi
             JOIN lab_orders o ON o.id = oi.order_id
             WHERE o.tenant_id = ? AND oi.status = 'pending'
             AND o.order_date < DATE_SUB(NOW(), INTERVAL 48 HOUR)
             AND o.status != 'cancelled'"
        );
        $stmt->execute([$tenantId]);
        $c = (int)$stmt->fetchColumn();
        if ($c > 0) {
            logOps($db, $tenantId, 'backlog_stale', "يوجد {$c} طلب/عناصر قديمة (أكثر من 48 ساعة) بانتظار البدء.", (string)$c);
        }
    } catch (Throwable $e) {
    }
    // حرجة بدون validated_at
    try {
        $stmt = $db->prepare(
            "SELECT COUNT(*) FROM results r
             JOIN order_items oi ON oi.id = r.order_item_id
             JOIN lab_orders o ON o.id = oi.order_id
             WHERE o.tenant_id = ? AND r.flag = 'C'
             AND (r.validated_at IS NULL OR r.validated_at = '0000-00-00 00:00:00')"
        );
        $stmt->execute([$tenantId]);
        $c2 = (int)$stmt->fetchColumn();
        if ($c2 > 0) {
            logOps($db, $tenantId, 'critical_unvalidated', "يوجد {$c2} نتيجة حرجة تحتاج اعتماد/مراجعة.", (string)$c2);
        }
    } catch (Throwable $e) {
    }
}

echo "lab_ops_alerts_cron done.\n";
