<?php
require_once 'config.php';
require_once '_vpn_helpers.php';
require_once __DIR__ . '/../../../src/GemAcc/ReferralService.php';
header('Content-Type: application/json; charset=utf-8');
$input=json_decode(file_get_contents('php://input'), true) ?: $_POST;
$userId=miniapp_require_admin();
$orderId=(int)($input['order_id']??0);
$action=strtoupper($input['action']??'');
if(!$orderId||!in_array($action,['APPROVE','REJECT','CANCEL','REMOVE_QUEUE','FAKE_RECEIPT'], true)){echo json_encode(['ok'=>false,'error'=>'order_id and action required'], JSON_UNESCAPED_UNICODE); exit;}

function gemacc_is_unpaid_stars_order(array $order): bool {
    return strtoupper((string)($order['payment_method'] ?? '')) === 'STARS'
        && strtolower((string)($order['payment_status'] ?? '')) !== 'paid';
}
function gemacc_stars_manual_action_error(): array {
    return ['ok'=>false,'error'=>'پرداخت استارز کاملاً خودکار است. سفارش پرداخت‌نشده استارز نباید دستی تأیید/رد شود یا اخطار فیش فیک بگیرد.'];
}

try {
    vpnEnsureColumns($pdo);
    if (function_exists('gemaccEnsureFakeReceiptSchema')) gemaccEnsureFakeReceiptSchema($pdo);

    if($action==='FAKE_RECEIPT'){
        $st=$pdo->prepare("SELECT * FROM orders WHERE id=?"); $st->execute([$orderId]); $order=$st->fetch(PDO::FETCH_ASSOC);
        if(!$order){echo json_encode(['ok'=>false,'error'=>'سفارش یافت نشد'], JSON_UNESCAPED_UNICODE); exit;}
        if (strtoupper((string)($order['payment_method'] ?? '')) === 'STARS') {
            echo json_encode(gemacc_stars_manual_action_error(), JSON_UNESCAPED_UNICODE); exit;
        }
        $result = function_exists('gemaccMarkFakeReceipt') ? gemaccMarkFakeReceipt($pdo, $orderId, (int)$userId) : ['ok'=>false,'error'=>'تابع اخطار فیش فیک در دسترس نیست'];
        echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        exit;
    }
    
    if($action==='REMOVE_QUEUE'){
        $st=$pdo->prepare("SELECT * FROM orders WHERE id=?"); $st->execute([$orderId]); $order=$st->fetch(PDO::FETCH_ASSOC);
        if(!$order){echo json_encode(['ok'=>false,'error'=>'سفارش یافت نشد'], JSON_UNESCAPED_UNICODE); exit;}
        if(($order['status']??'')!=='QUEUED'){echo json_encode(['ok'=>false,'error'=>'این سفارش در صف تحویل نیست'], JSON_UNESCAPED_UNICODE); exit;}
        $pdo->beginTransaction();
        $pdo->prepare("DELETE FROM waiting_queue WHERE order_id=?")->execute([$orderId]);
        $pdo->prepare("UPDATE orders SET status='CANCELLED', delivery_status='cancelled', updated_at=NOW() WHERE id=?")->execute([$orderId]);
        $pdo->commit();
        tg('sendMessage',['chat_id'=>$order['user_id'],'text'=>"🚫 سفارش #{$orderId} از صف تحویل خارج شد.
در صورت نیاز با پشتیبانی تماس بگیرید."]);
        gemaccAdminActionNotify('سفارش از صف تحویل خارج شد', ['شماره سفارش'=>$orderId, 'کاربر'=>$order['user_id'] ?? '-', 'مبلغ'=>isset($order['price']) ? money((int)$order['price']) : '-'], $userId);
        echo json_encode(['ok'=>true,'message'=>'سفارش از صف خارج شد'], JSON_UNESCAPED_UNICODE); exit;
    }

    if($action==='REJECT'||$action==='CANCEL'){
        $st=$pdo->prepare("SELECT * FROM orders WHERE id=?"); $st->execute([$orderId]); $order=$st->fetch(PDO::FETCH_ASSOC);
        if(!$order){echo json_encode(['ok'=>false,'error'=>'سفارش یافت نشد'], JSON_UNESCAPED_UNICODE); exit;}
        if (gemacc_is_unpaid_stars_order($order)) { echo json_encode(gemacc_stars_manual_action_error(), JSON_UNESCAPED_UNICODE); exit; }
        if (($order['payment_method'] ?? '') === 'CRYPTO_PLISIO' && ($order['payment_status'] ?? '') !== 'paid') {
            echo json_encode(['ok'=>false,'error'=>'این سفارش مربوط به درگاه Plisio است و قبل از پرداخت موفق نباید دستی تأیید/رد شود.'], JSON_UNESCAPED_UNICODE); exit;
        }
        $new=$action==='REJECT'?'REJECTED':'CANCELLED';
        $pdo->prepare("UPDATE orders SET status=?, delivery_status='cancelled' WHERE id=?")->execute([$new,$orderId]);
        $pdo->prepare("UPDATE crypto_payments SET status=?, processed_by=?, processed_at=NOW() WHERE order_id=? AND status<>'PAID'")->execute([$new,(int)$userId,$orderId]);
        if(($order['payment_method']??'')==='WALLET'){
            $pdo->prepare("UPDATE users SET balance=balance+? WHERE id=?")->execute([(int)$order['price'],(int)$order['user_id']]);
            $pdo->prepare("INSERT INTO wallet_transactions(user_id,amount,type,status,description) VALUES(?,?, 'REFUND','COMPLETED',?)")->execute([(int)$order['user_id'],(int)$order['price'],'استرداد سفارش #'.$orderId]);
        }
        tg('sendMessage',['chat_id'=>$order['user_id'],'text'=>($action==='REJECT'?'❌':'🚫')." سفارش #{$orderId} لغو/رد شد."]);
        gemaccAdminActionNotify($action==='REJECT' ? 'سفارش رد شد' : 'سفارش لغو شد', ['شماره سفارش'=>$orderId, 'کاربر'=>$order['user_id'] ?? '-', 'مبلغ'=>isset($order['price']) ? money((int)$order['price']) : '-', 'روش پرداخت'=>$order['payment_method'] ?? '-'], $userId);
        echo json_encode(['ok'=>true,'message'=>'انجام شد'], JSON_UNESCAPED_UNICODE); exit;
    }

    $st=$pdo->prepare("SELECT * FROM orders WHERE id=?"); $st->execute([$orderId]); $order=$st->fetch(PDO::FETCH_ASSOC);
    if(!$order){echo json_encode(['ok'=>false,'error'=>'سفارش یافت نشد'], JSON_UNESCAPED_UNICODE); exit;}
    if (gemacc_is_unpaid_stars_order($order)) { echo json_encode(gemacc_stars_manual_action_error(), JSON_UNESCAPED_UNICODE); exit; }
    if (($order['payment_method'] ?? '') === 'CRYPTO_PLISIO' && ($order['payment_status'] ?? '') !== 'paid') {
        echo json_encode(['ok'=>false,'error'=>'این سفارش مربوط به درگاه Plisio است و فقط بعد از callback پرداخت موفق به صورت خودکار پردازش می‌شود.'], JSON_UNESCAPED_UNICODE); exit;
    }
    $result = vpnApproveOrderAndNotify($pdo, $orderId, true);
    if (!empty($result['success'])) {
        $n = $result['notification'] ?? [];
        $sent = !empty($n['telegram_sent']);
        $referralReward = ['ok'=>false];
        try { $referralReward = \GemAcc\ReferralService::rewardFirstPurchase($pdo, (int)$order['user_id'], (int)$orderId, (int)$order['price']); } catch (Throwable $ignored) {}
        if (!empty($referralReward['ok']) && (int)($referralReward['amount'] ?? 0) > 0) {
            tg('sendMessage', ['chat_id'=>(int)$referralReward['referrer_id'], 'text'=>'🎁 پاداش معرفی شما برای اولین خرید کاربر جدید اضافه شد: ' . money((int)$referralReward['amount'])]);
        }
        $msg = $sent
            ? 'سفارش تأیید و سرویس به کاربر ارسال شد'
            : 'سفارش تحویل شد اما ارسال پیام تلگرام ناموفق بود';
        gemaccAdminActionNotify('سفارش تأیید شد', ['شماره سفارش'=>$orderId, 'کاربر'=>$order['user_id'] ?? '-', 'مبلغ'=>isset($order['price']) ? money((int)$order['price']) : '-', 'ارسال تلگرام'=>$sent ? 'موفق' : 'ناموفق', 'پاداش معرفی'=>!empty($referralReward['ok']) ? money((int)($referralReward['amount'] ?? 0)) : 'ندارد'], $userId);
        echo json_encode([
            'ok'=>true,
            'message'=>$msg,
            'queued'=>false,
            'notification'=>$n,
            'admin_notice'=>vpnNotificationAdminMessage($n, $orderId),
        ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        exit;
    }
    if (!empty($result['already_delivered'])) {
        $resend = vpnResendDeliveryNotification($pdo, $orderId, true);
        gemaccAdminActionNotify('ارسال مجدد تحویل سفارش انجام شد', ['شماره سفارش'=>$orderId, 'ارسال تلگرام'=>!empty($resend['telegram_sent']) ? 'موفق' : 'ناموفق'], $userId);
        echo json_encode([
            'ok'=>!empty($resend['telegram_sent']),
            'message'=>!empty($resend['telegram_sent']) ? 'این سفارش قبلاً تحویل شده بود؛ پیام سرویس دوباره برای کاربر ارسال شد' : 'این سفارش قبلاً تحویل شده بود اما ارسال مجدد پیام ناموفق بود',
            'already_delivered'=>true,
            'notification'=>$resend,
            'admin_notice'=>vpnNotificationAdminMessage($resend, $orderId),
        ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
    }
    if (!empty($result['queued'])) {
        gemaccAdminActionNotify('سفارش تأیید شد اما به صف تحویل رفت', ['شماره سفارش'=>$orderId, 'کاربر'=>$order['user_id'] ?? '-', 'مبلغ'=>isset($order['price']) ? money((int)$order['price']) : '-'], $userId);
        echo json_encode([
            'ok'=>true,
            'warning_code'=>'OUT_OF_STOCK',
            'error_code'=>'OUT_OF_STOCK',
            'message'=>'📦 موجودی کافی نیست؛ سفارش در صف تحویل قرار گرفت. بعد از افزودن اشتراک، سرویس خودکار برای کاربر ارسال می‌شود.',
            'queued'=>true,
            'order_id'=>$orderId,
            'notification'=>$result['notification'] ?? null,
        ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
    }
    echo json_encode(['ok'=>false,'error'=>'خطا: '.($result['message'] ?? 'تأیید سفارش ناموفق بود')], JSON_UNESCAPED_UNICODE); exit;
} catch(Throwable $e) {
    if($pdo->inTransaction()) $pdo->rollBack();
    vpnLogEvent('admin_order_action_failed', ['order_id'=>$orderId,'action'=>$action,'error'=>$e->getMessage()]);
    $err = $e->getMessage();
    $pretty = (stripos($err, 'There is no active transaction') !== false)
        ? 'موجودی کافی نیست یا عملیات تحویل به صف منتقل شد. دوباره صفحه سفارشات را بروزرسانی کنید.'
        : ('خطا: '.$err);
    echo json_encode(['ok'=>false,'error'=>$pretty], JSON_UNESCAPED_UNICODE);
}
