<?php
require_once __DIR__ . '/../../config.php';
require_once __DIR__ . '/../../engine/UsageMeter.php';
require_once __DIR__ . '/../../engine/Kernel.php';
require_once __DIR__ . '/../../engine/BillingEngine.php'; // AI_GUARD
require_once __DIR__ . '/../../engine/Logger.php';

// KERNEL: trace + optional auth
$_k = Kernel::handle(['auth' => 'optional']);
$b      = json_decode(file_get_contents('php://input'), true) ?? [];
$action = $_GET['action'] ?? (($_SERVER['REQUEST_METHOD'] === 'GET') ? 'list' : 'add');
if (isset($b['action'])) $action = $b['action'];
// الزوار يمكنهم رؤية المنشورات، النشر يحتاج تسجيل دخول
$guest = ['id'=>0,'subscription_tier'=>'free','neighborhood_id'=>0,'user_type'=>'user'];
$u = $action === 'list' ? (current_user() ?: $guest) : require_auth();

// ── قائمة المنشورات ────────────────────────────────────────────
if ($action === 'list') {
    $hood   = (int)($u['neighborhood_id'] ?? 0);
    $params = [];
    $where  = 'p.status = "active"';
    if ($hood) {
        $where   .= ' AND p.neighborhood_id = ?';
        $params[] = $hood;
    }
    $st = db()->prepare(
        "SELECT p.*, u.name AS author
         FROM pulse_posts p
         JOIN users u ON u.id = p.user_id
         WHERE $where
         ORDER BY p.is_urgent DESC, p.created_at DESC
         LIMIT 30"
    );
    $st->execute($params);
    json_response(['success' => true, 'posts' => $st->fetchAll()]);
}

// ── إضافة منشور ───────────────────────────────────────────────
if ($action === 'add') {
    $content = mb_substr(trim($b['content'] ?? ''), 0, 1000);
    $type    = $b['type'] ?? 'announcement';
    if (!$content) json_response(['error' => 'content_required'], 400);

    $allowed_types = ['urgent', 'exchange', 'health', 'announcement', 'news', 'initiative', 'medication'];
    if (!in_array($type, $allowed_types)) $type = 'announcement';

    // Rate limiting مُدمج: medication لها حارسان في استعلام واحد لكل منهما
    if ($type === 'medication') {
        // الحارس الجغرافي أولاً (لا DB queries) — سريع
        if (!(int)($u['neighborhood_id'] ?? 0))
            json_response(['error' => 'neighborhood_required', 'message' => 'يجب تحديد حيّك أولاً لاستخدام رادار الأدوية'], 403);
        // Rate limit خاص بالأدوية: 3/يوم فقط
        if (!check_rate_limit('medication_post_' . $u['id'], 3, 86400))
            json_response(['error' => 'rate_limit', 'message' => 'الحد اليومي لمنشورات الأدوية هو 3 — شكراً لمروءتك!'], 429);
    } else {
        // Rate limit عام لبقية الأنواع: 10/ساعة
        if (!check_rate_limit('pulse_add_' . $u['id'], 10, 3600))
            json_response(['error' => 'too_many_posts', 'message' => 'حاول لاحقاً'], 429);
    }
    $is_urgent  = $type === 'urgent' ? 1 : 0;
    $ai_note    = '';
    $hood       = (int)($u['neighborhood_id'] ?? 0);

    // ── مراجعة AI للمنشورات الصحية ────────────────────────────────
    if ($type === 'health') {
    // AI_GUARD: daily limit check
    $_ai_plan = $u['plan_key'] ?? 'free';
    $_ai_limit = BillingEngine::checkAILimit((int)$u['id'], $_ai_plan);
    if (!empty($_ai_limit['exceeded'])) {
        json_response(['error'=>'daily_limit_exceeded','message'=>"تجاوزت حد {$_ai_limit['limit']} استدعاء/يوم",'used'=>$_ai_limit['used'],'limit'=>$_ai_limit['limit']], 429);
    }
    unset($_ai_plan, $_ai_limit);
                // Safety: evaluate user input before AI call
        $_se_in = SafetyEngine::evaluateInput($content ?? '', ['endpoint' => 'pulse/posts.php']);
        if ($_se_in['action'] === SafetyEngine::BLOCK) {
            Logger::warn('ai_input_blocked', ['endpoint' => 'pulse/posts.php']);
            $ai_note = null;
        } elseif ($_se_in['action'] === SafetyEngine::WARN) {
            $ai_note = SafetyEngine::emergencyResponse();
        } else {
            $_um_pls = UsageMeter::wrap((int)$u['id'], 'chat', 'medical', fn() => AIClient::call("راجع هذا المنشور الصحي وأضف ملاحظة قصيرة (جملة واحدة فقط): $content", 'أنت مراجع طبي سوداني متخصص. كن موجزاً ومفيداً.', 'auto', 80, 0.3, false), ['skip_debit' => true]);
            $ai_note = $_um_pls['ok'] ? ($_um_pls['result']['text'] ?? null) : null;

            // Safety: evaluate AI output
            if ($ai_note) {
                $_se_out = SafetyEngine::evaluateOutput($ai_note, 'medical');
                if ($_se_out['action'] === SafetyEngine::WARN && !empty($_se_out['replace'])) {
                    $ai_note = $_se_out['replace'];
                } elseif ($_se_out['action'] === SafetyEngine::BLOCK) {
                    $ai_note = null;
                }
            }
        }

        if ($ai_note) Logger::aiUsage((int)$u['id'], 'pulse_ai_note', ['service'=>'pulse:note']);
    }

    // ── حفظ المنشور ────────────────────────────────────────────────
    db()->prepare(
        'INSERT INTO pulse_posts (user_id, neighborhood_id, type, content, is_urgent, ai_health_note)
         VALUES (?, ?, ?, ?, ?, ?)'
    )->execute([$u['id'], $hood ?: null, $type, $content, $is_urgent, $ai_note]);

    $pid = (int)db()->lastInsertId();
    db()->prepare('UPDATE users SET points_community = points_community + 5 WHERE id = ?')->execute([$u['id']]);

    // ── إشعارات FCM بحسب نوع المنشور ─────────────────────────────
    if ($hood) {

        // منشورات عاجلة وصحية — الإشعار الأصلي
        if (in_array($type, ['urgent', 'health'])) {
            $tokens = get_hood_tokens($hood, (int)$u['id']);
            $ptitle = $is_urgent ? '🆘 طلب عاجل من جارك!' : '💊 منشور صحي من حيّك';
            $pbody  = mb_substr($content, 0, 80);
            foreach (array_slice($tokens, 0, 50) as $t) {
                send_push($t, $ptitle, $pbody, ['post_id' => (string)$pid, 'tag' => 'pulse']);
            }
        }

        // ── ٢️⃣ مساعد الأسرة: رادار الأدوية — إشعار فوري للحي ───────────
        if ($type === 'medication') {
            $med_tokens = get_hood_tokens($hood, (int)$u['id']);
            $med_title  = '💊 رادار الأدوية: دواء متوفر';
            $med_body   = 'جارك في الحي أبلغ عن توفر دواء قد تحتاجه، راجع نبض الحي الآن.';
            foreach (array_slice($med_tokens, 0, 100) as $t) {
                send_push($t, $med_title, $med_body, [
                    'post_id' => (string)$pid,
                    'tag'     => 'medication_radar',
                    'type'    => 'medication',
                ]);
            }
            error_log('[pulse/medication] sent to ' . count(array_slice($med_tokens, 0, 100)) . ' neighbors in hood_id=' . $hood);
        }
    }

    json_response([
        'success'  => true,
        'id'       => $pid,
        'ai_note'  => $ai_note,
        'type'     => $type,
    ]);
}

// ── الانضمام لمبادرة ───────────────────────────────────────────
if ($action === 'join') {
    $id = (int)($b['post_id'] ?? 0);
    $st = db()->prepare('SELECT * FROM pulse_posts WHERE id = ? AND type = "initiative" LIMIT 1');
    $st->execute([$id]);
    $post = $st->fetch();
    if (!$post) json_response(['error' => 'not_found'], 404);

    $participants = json_decode($post['participants'] ?: '[]', true);
    if (!in_array($u['id'], $participants)) {
        $participants[] = $u['id'];
        db()->prepare('UPDATE pulse_posts SET participants = ? WHERE id = ?')
            ->execute([json_encode($participants, JSON_UNESCAPED_UNICODE), $id]);
    }
    json_response(['success' => true, 'count' => count($participants)]);
}

// ── حل المنشور ─────────────────────────────────────────────────
if ($action === 'resolve') {
    $id = (int)($b['post_id'] ?? 0);
    db()->prepare('UPDATE pulse_posts SET status = "resolved" WHERE id = ? AND user_id = ?')
        ->execute([$id, $u['id']]);
    json_response(['success' => true,
        'trace_id' => Logger::traceId()]);
}

json_response(['error' => 'unknown_action'], 400);
