<?php
require_once __DIR__ . '/_init.php';
rx_cron_boot('zarinpaycheck', 120);

ini_set('error_log', 'error_log');

$ctx = rx_cron_load_payment_context();
if (empty($ctx['db_ready'])) {
    return;
}
require_once __DIR__ . '/../lib/PaymentConfirm.php';

global $pdo, $setting;
$setting        = $ctx['setting'];
$paymentreports = $ctx['paymentreports'];

if (!($pdo instanceof PDO)) {
    error_log('[zarinpaycheck] no PDO connection');
    return;
}

$logFile = __DIR__ . '/../logs/zarinpay_poll.log';
$log = static function (string $level, string $msg, array $ctx = []) use ($logFile): void {
    $line = '[' . date('Y-m-d H:i:s') . '] [' . $level . '] [zarinpaycheck] ' . $msg;
    if (!empty($ctx)) {
        $line .= ' ' . json_encode($ctx, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    }
    @file_put_contents($logFile, $line . PHP_EOL, FILE_APPEND);
    if ($level === 'ERROR' || $level === 'WARN') {
        error_log($line);
    }
};

// چرا این کرون لازمه:
// CubePay (زرین‌پی / smspay) فقط از طریق ریدایرکت مرورگر کاربر به
// payment/ZarinPay/successful.php تایید می‌شه. کاربرهایی که با اسکن QR
// مستقیم از اپ بانک پرداخت می‌کنن (بدون برگشتن به صفحه‌ی مرورگر) هیچ‌وقت
// callback_url رو لود نمی‌کنن، پس DirectPayment() هیچ‌وقت اجرا نمی‌شه و
// فاکتور بعد از ۳۰ دقیقه توسط payment_expire.php منقضی می‌شه — با اینکه پول
// واقعاً واریز و توسط CubePay تایید شده. این کرون هر فاکتور «Unpaid» زرین‌پی
// رو مستقیماً از verify-payment.php استعلام می‌کنه، مستقل از مرورگر کاربر.

$token = getPaySettingValue('token_zarinpey');
if (empty($token) || $token === '0') {
    return;
}

$stmt = $pdo->prepare(
    "SELECT id_order, dec_not_confirmed, price, id_user, time
       FROM Payment_report
      WHERE payment_Status = 'Unpaid'
        AND Payment_Method = 'zarinpay'
        AND dec_not_confirmed IS NOT NULL
        AND dec_not_confirmed <> ''
      ORDER BY id DESC
      LIMIT 30"
);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

if (empty($rows)) {
    return;
}

foreach ($rows as $row) {
    $orderId = (string) $row['id_order'];

    // به همون شکلی که موقع ساخت فاکتور ذخیره شده استخراجش می‌کنیم
    // (JSON با کلید authority، یا رشته‌ی خام authority به‌عنوان fallback قدیمی).
    $note = trim((string) $row['dec_not_confirmed']);
    $decoded = json_decode($note, true);
    if (is_array($decoded) && !empty($decoded['authority'])) {
        $authority = (string) $decoded['authority'];
    } else {
        $authority = $note;
    }

    if ($authority === '') {
        continue;
    }

    $payload = json_encode(['authority' => $authority], JSON_UNESCAPED_UNICODE);

    $ch = curl_init('https://cubevps.ir/smspay/api/verify-payment.php');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: application/json',
        'Authorization: Bearer ' . $token,
    ]);
    curl_setopt($ch, CURLOPT_TIMEOUT, 12);

    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        $log('WARN', 'verify curl error', ['order_id' => $orderId, 'err' => curl_error($ch)]);
        curl_close($ch);
        continue;
    }
    curl_close($ch);

    $result = json_decode($response, true);
    $verified = is_array($result) && (
        !empty($result['success'])
        || (($result['status'] ?? '') === 'verified')
    );

    if (!$verified) {
        continue;
    }

    $log('INFO', 'detected verified payment via polling', [
        'order_id' => $orderId,
    ]);

    $transactionId = $result['data']['transaction']['payment_id'] ?? '';
    $extra = [
        'method'      => 'زرین پی',
        'thread_id'   => $paymentreports,
        'extra_lines' => array_filter([
            $transactionId !== '' ? ('شناسه تراکنش : ' . $transactionId) : '',
            '🔁 تایید از طریق پولر (کاربر به مرورگر برنگشته بود)',
        ]),
    ];

    $confirmResult = payment_confirm_paid($orderId, '', $extra);
    $log($confirmResult['ok'] ? 'OK' : 'WARN', 'payment_confirm_paid result', $confirmResult);
}
