<?php
require_once 'config.php';
header('Content-Type: application/json; charset=utf-8');

$input = json_decode(file_get_contents('php://input'), true) ?: $_POST;
$adminId = miniapp_require_admin();

function admin_users_ok(array $data=[]): void { echo json_encode(['ok'=>true,'data'=>$data], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); exit; }
function admin_users_err(string $e): void { echo json_encode(['ok'=>false,'error'=>$e], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); exit; }
function admin_users_money_int($v): int { return max(0, (int)preg_replace('/\D+/', '', (string)$v)); }

try {
    $action = (string)($input['action'] ?? $_GET['action'] ?? 'list');
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && $action !== 'list') {
        $targetId = (int)($input['target_user_id'] ?? 0);
        if (!$targetId && !in_array($action, ['send_top_buyers_discount'], true)) admin_users_err('شناسه کاربر الزامی است');
        if ($targetId && $targetId === $adminId && $action === 'delete') admin_users_err('حذف ادمین فعلی مجاز نیست');

        if ($action === 'delete') {
            // حذف مستقیم برای امنیت پروژه فعال غیرفعال شد؛ به جای آن کاربر soft-block می‌شود.
            $pdo->prepare("UPDATE users SET is_blocked=1, blocked_reason='Soft delete / disabled by admin', blocked_at=NOW() WHERE id=? AND is_admin=0")->execute([$targetId]);
            gemaccAdminActionNotify('کاربر از پنل مینی‌اپ مسدود/حذف نرم شد', ['کاربر'=>$targetId, 'نوع عملیات'=>'حذف نرم / مسدودسازی'], $adminId);
            admin_users_ok(['message'=>'حذف مستقیم غیرفعال است؛ کاربر مسدود شد']);
        }
        if ($action === 'increase_balance' || $action === 'decrease_balance') {
            $amount = admin_users_money_int($input['amount'] ?? 0);
            if ($amount <= 0) admin_users_err('مبلغ نامعتبر است');
            $pdo->beginTransaction();
            $st = $pdo->prepare("SELECT balance FROM users WHERE id=? FOR UPDATE");
            $st->execute([$targetId]);
            $u = $st->fetch(PDO::FETCH_ASSOC);
            if (!$u) { $pdo->rollBack(); admin_users_err('کاربر یافت نشد'); }
            if ($action === 'decrease_balance' && (int)$u['balance'] < $amount) { $pdo->rollBack(); admin_users_err('موجودی کاربر کافی نیست'); }
            $delta = $action === 'increase_balance' ? $amount : -$amount;
            $pdo->prepare("UPDATE users SET balance=balance+? WHERE id=?")->execute([$delta, $targetId]);
            $type = $action === 'increase_balance' ? 'ADMIN_CREDIT' : 'ADMIN_DEBIT';
            $reason = trim((string)($input['reason'] ?? ''));
            $desc = $action === 'increase_balance' ? 'افزایش موجودی توسط مدیر' : 'کاهش موجودی توسط مدیر';
            if ($reason !== '') $desc .= ' - ' . $reason;
            $pdo->prepare("INSERT INTO wallet_transactions(user_id,amount,type,status,payment_method,currency,description,processed_by,processed_at) VALUES(?,?,?,?, 'admin','IRT',?,?,NOW())")
                ->execute([$targetId, abs($delta), $type, 'APPROVED', $desc, $adminId]);
            $pdo->commit();
            tg('sendMessage', ['chat_id'=>$targetId, 'text'=>($delta>0?'✅ موجودی شما افزایش یافت: ':'⚠️ موجودی شما کاهش یافت: ') . money(abs($delta))]);
            gemaccAdminActionNotify($delta > 0 ? 'افزایش موجودی کاربر انجام شد' : 'کاهش موجودی کاربر انجام شد', ['کاربر'=>$targetId, 'مبلغ'=>money(abs($delta)), 'توضیح'=>$reason ?: '-'], $adminId);
            admin_users_ok(['message'=>'موجودی بروزرسانی شد']);
        }
        if ($action === 'block_user' || $action === 'unblock_user') {
            $reason = trim((string)($input['reason'] ?? 'رسید نامعتبر / ارسال رسید فیک'));
            if ($action === 'block_user') {
                $pdo->prepare("UPDATE users SET is_blocked=1, blocked_reason=?, blocked_at=NOW() WHERE id=?")->execute([$reason, $targetId]);
                tg('sendMessage', ['chat_id'=>$targetId, 'text'=>'⛔ حساب شما به دلیل ارسال رسید نامعتبر مسدود شد. برای بررسی با پشتیبانی تماس بگیرید.']);
                gemaccAdminActionNotify('کاربر مسدود شد', ['کاربر'=>$targetId, 'دلیل'=>$reason], $adminId);
                admin_users_ok(['message'=>'کاربر مسدود شد']);
            } else {
                $pdo->prepare("UPDATE users SET is_blocked=0, blocked_reason=NULL, blocked_at=NULL WHERE id=?")->execute([$targetId]);
                tg('sendMessage', ['chat_id'=>$targetId, 'text'=>'✅ محدودیت حساب شما برداشته شد.']);
                gemaccAdminActionNotify('مسدودی کاربر برداشته شد', ['کاربر'=>$targetId], $adminId);
                admin_users_ok(['message'=>'مسدودی کاربر برداشته شد']);
            }
        }
        if ($action === 'send_message') {
            $message = trim((string)($input['message'] ?? ''));
            if ($message === '') admin_users_err('متن پیام الزامی است');
            $sendResult = function_exists('gemaccSendPrivateAdminMessageToUser')
                ? gemaccSendPrivateAdminMessageToUser($targetId, $message, $adminId)
                : ['ok' => (bool)tg('sendMessage', ['chat_id'=>$targetId, 'text'=>$message])];
            if (empty($sendResult['ok'])) admin_users_err('ارسال پیام به کاربر ناموفق بود');
            gemaccAdminActionNotify('پیام خصوصی برای کاربر ارسال شد', ['کاربر'=>$targetId, 'متن پیام'=>mb_substr($message,0,500,'UTF-8'), 'دکمه پاسخ'=>'فعال'], $adminId);
            admin_users_ok(['message'=>'پیام ارسال شد و دکمه پاسخ برای کاربر فعال شد']);
        }
        if ($action === 'send_discount') {
            $code = trim((string)($input['code'] ?? ''));
            $message = trim((string)($input['message'] ?? ''));
            if ($code === '') admin_users_err('کد تخفیف الزامی است');
            $pdo->exec("CREATE TABLE IF NOT EXISTS user_discount_codes (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT NOT NULL, discount_id INT UNSIGNED NULL, code VARCHAR(50) NOT NULL, title VARCHAR(255) NULL, message TEXT NULL, source VARCHAR(50) DEFAULT 'admin', is_active TINYINT(1) NOT NULL DEFAULT 1, used_at DATETIME NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id), UNIQUE KEY uniq_user_code(user_id,code), INDEX idx_udc_user(user_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci");
            $di=$pdo->prepare("SELECT id FROM discount_codes WHERE code=? LIMIT 1"); $di->execute([$code]); $discountId=(int)($di->fetchColumn() ?: 0);
            $pdo->prepare("INSERT INTO user_discount_codes(user_id,discount_id,code,title,message,source) VALUES(?,?,?,?,?,'admin') ON DUPLICATE KEY UPDATE discount_id=VALUES(discount_id), message=VALUES(message), is_active=1")->execute([$targetId,$discountId ?: null,$code,'کد تخفیف اختصاصی',$message]);
            $txt = ($message !== '' ? $message . "\n\n" : '') . "🎫 کد تخفیف اختصاصی شما: `{$code}`";
            tg('sendMessage', ['chat_id'=>$targetId, 'text'=>$txt, 'parse_mode'=>'Markdown']);
            gemaccAdminActionNotify('کد تخفیف اختصاصی برای کاربر ارسال شد', ['کاربر'=>$targetId, 'کد'=>$code], $adminId);
            admin_users_ok(['message'=>'کد تخفیف ارسال شد']);
        }
        admin_users_err('Action نامعتبر است');
    }

    $q = trim((string)($_GET['q'] ?? ''));
    $filter = trim((string)($_GET['filter'] ?? 'all'));
    $page = max(1, (int)($_GET['page'] ?? 1));
    $limit = 24;
    $offset = ($page - 1) * $limit;
    $where = '1=1'; $params = [];
    if ($q !== '') { $where .= " AND (CAST(u.id AS CHAR) LIKE ? OR u.username LIKE ? OR u.first_name LIKE ? OR u.last_name LIKE ?)"; $like='%'.$q.'%'; $params=[$like,$like,$like,$like]; }
    if ($filter === 'top') $where .= " AND COALESCE(stats.orders_count,0) > 0";

    $cntSql = "SELECT COUNT(*) FROM users u LEFT JOIN (SELECT user_id, COUNT(*) orders_count, COALESCE(SUM(price),0) total_spent FROM orders WHERE status IN ('DELIVERED','APPROVED','PAID') GROUP BY user_id) stats ON stats.user_id=u.id WHERE {$where}";
    $cnt = $pdo->prepare($cntSql); $cnt->execute($params); $total = (int)$cnt->fetchColumn();
    $sql = "SELECT u.id,u.username,u.first_name,u.last_name,u.is_admin,u.is_blocked,u.blocked_reason,u.balance,u.created_at,
                   COALESCE(stats.orders_count,0) orders_count, COALESCE(stats.total_spent,0) total_spent
            FROM users u
            LEFT JOIN (SELECT user_id, COUNT(*) orders_count, COALESCE(SUM(price),0) total_spent FROM orders WHERE status IN ('DELIVERED','APPROVED','PAID') GROUP BY user_id) stats ON stats.user_id=u.id
            WHERE {$where}
            ORDER BY " . ($filter === 'top' ? 'total_spent DESC, orders_count DESC' : 'u.created_at DESC') . " LIMIT {$limit} OFFSET {$offset}";
    $st = $pdo->prepare($sql); $st->execute($params);
    $users = $st->fetchAll(PDO::FETCH_ASSOC);
    foreach ($users as &$u) { $u['id']=(int)$u['id']; $u['balance']=(int)$u['balance']; $u['orders_count']=(int)$u['orders_count']; $u['total_spent']=(int)$u['total_spent']; $u['is_blocked']=(int)($u['is_blocked'] ?? 0); }
    admin_users_ok(['users'=>$users, 'total'=>$total ?? count($users), 'page'=>$page ?? 1, 'has_more'=>(($offset ?? 0) + count($users)) < ($total ?? count($users))]);
} catch (Throwable $e) {
    if ($pdo->inTransaction()) $pdo->rollBack();
    error_log('[admin_users] '.$e->getMessage()); admin_users_err($e->getMessage());
}
