<?php
// modules/wallet/wallet.php
require_once '../../includes/auth.php';
checkLogin();
require_once '../../config/db.php';

// ==========================================
// فراخوانی توابع سیستم و تبدیل تاریخ
// ==========================================
require_once '../../includes/functions.php';

if (!function_exists('format_shamsi')) {
    function format_shamsi($datetime) {
        if (empty($datetime)) return '-';
        $ts = strtotime($datetime);
        
        // استفاده از تابع تقویم موجود در سیستم شما
        $jalali = gregorian_to_jalali(date('Y', $ts), date('m', $ts), date('d', $ts));
        
        // رفع خطای Array to String: اگر خروجی آرایه بود آن را به رشته تبدیل کن
        $date_str = is_array($jalali) ? implode('/', $jalali) : $jalali;
        
        $time = date('H:i', $ts);
        return "$date_str <span class='text-[10px] text-gray-400 opacity-80'>$time</span>";
    }
}

// ==========================================
// اطمینان از وجود جداول پایه و ارتقای دیتابیس
// ==========================================
try {
    $pdo->query("SELECT credit_debt FROM users LIMIT 1");
} catch (PDOException $e) {
    $pdo->exec("ALTER TABLE users ADD COLUMN credit_debt BIGINT DEFAULT 0 AFTER wallet_balance");
}
try {
    $pdo->query("SELECT emergency_amount FROM users LIMIT 1");
} catch (PDOException $e) {
    $pdo->exec("ALTER TABLE users ADD COLUMN emergency_amount BIGINT DEFAULT NULL AFTER credit_debt");
}
try {
    $pdo->exec("CREATE TABLE IF NOT EXISTS `wallet_logs` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` int(11) NOT NULL COMMENT '0 means All Operators',
      `type` varchar(50) NOT NULL COMMENT 'manual_add, manual_sub, credit_add, bonus_add',
      `amount` bigint(20) NOT NULL,
      `description` varchar(255) DEFAULT NULL,
      `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
} catch (PDOException $e) {}
try {
    $pdo->exec("INSERT IGNORE INTO `global_settings` (`setting_key`, `setting_value`) VALUES ('global_emergency_charge', '0')");
} catch (PDOException $e) {}

$userId = $_SESSION['user_id'];
$isAdmin = isAdmin();
$msg = '';
$error = '';

// ==========================================
// دریافت وضعیت داینامیک بونوس و تایمر آن
// ==========================================
$isBonusSystemActive = false;
$activeBonuses = [];
$bonusTimerActive = false;
$bonusTimerDate = null;
$timerExpired = false;

try {
    $isBonusSystemActive = $pdo->query("SELECT setting_value FROM global_settings WHERE setting_key = 'bonus_system_status'")->fetchColumn() === '1';
    $bonusTimerActive = $pdo->query("SELECT setting_value FROM global_settings WHERE setting_key = 'bonus_timer_active'")->fetchColumn() === '1';
    $bonusTimerDate = $pdo->query("SELECT setting_value FROM global_settings WHERE setting_key = 'bonus_timer_date'")->fetchColumn();
    
    if ($bonusTimerActive && !empty($bonusTimerDate) && time() > strtotime($bonusTimerDate)) {
        $isBonusSystemActive = false;
        $timerExpired = true;
    }

    // --- شرط سلب بونوس از نماینده دارای قیمت ویژه (نسخه ایمن) ---
    if ($isBonusSystemActive && !$isAdmin) {
        $stmtSpecial = $pdo->prepare("SELECT allow_bonus FROM user_prices WHERE user_id = ?");
        $stmtSpecial->execute([$userId]);
        $userBonusPermissions = $stmtSpecial->fetchAll(PDO::FETCH_COLUMN);

        if (count($userBonusPermissions) > 0) {
            $hasBonusPermission = false;
            foreach ($userBonusPermissions as $ab) {
                if ($ab == 1) { $hasBonusPermission = true; break; }
            }
            if (!$hasBonusPermission) {
                $isBonusSystemActive = false; 
            }
        }
    }

    if ($isBonusSystemActive) {
        $activeBonuses = $pdo->query("SELECT * FROM bonus_settings WHERE is_active = 1 ORDER BY min_amount DESC")->fetchAll();
    }
} catch (Exception $e) {}

// ==========================================
// پردازش عملیات‌های فرم
// ==========================================
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
    
    if ($_POST['action'] === 'request_charge' && !$isAdmin) {
        $amount = (int)str_replace(',', '', $_POST['amount']);
        $receiptText = trim($_POST['receipt_text']);
        $receiptFile = null;

        if ($amount <= 0) {
            $error = "مبلغ شارژ نامعتبر است.";
        } else {
            if (isset($_FILES['receipt_file']) && $_FILES['receipt_file']['error'] === UPLOAD_ERR_OK) {
                $ext = pathinfo($_FILES['receipt_file']['name'], PATHINFO_EXTENSION);
                $allowed = ['jpg', 'jpeg', 'png', 'pdf'];
                if (in_array(strtolower($ext), $allowed)) {
                    $receiptFile = time() . '_' . rand(100, 999) . '.' . $ext;
                    if (!is_dir('../../uploads/receipts/')) { mkdir('../../uploads/receipts/', 0777, true); }
                    move_uploaded_file($_FILES['receipt_file']['tmp_name'], '../../uploads/receipts/' . $receiptFile);
                } else {
                    $error = "فرمت فایل مجاز نیست (فقط عکس یا PDF).";
                }
            } else {
                $error = "آپلود تصویر فیش واریزی الزامی است.";
            }

            if (!$error) {
                $stmt = $pdo->prepare("INSERT INTO settlements (user_id, amount, receipt_text, receipt_file, status) VALUES (?, ?, ?, ?, 'pending')");
                $stmt->execute([$userId, $amount, $receiptText, $receiptFile]);
                $msg = "درخواست شارژ ثبت شد و پس از تایید مدیریت، ابتدا بدهی اعتباری (در صورت وجود) کسر شده و بونوس تنها به مبلغ خالص باقیمانده تعلق می‌گیرد.";
            }
        }
    }

    if ($_POST['action'] === 'approve_charge' && $isAdmin) {
        $reqId = (int)$_POST['req_id'];
        $pdo->beginTransaction();
        try {
            $stmt = $pdo->prepare("SELECT s.*, u.credit_debt, u.wallet_balance FROM settlements s JOIN users u ON s.user_id = u.id WHERE s.id = ? AND s.status = 'pending' FOR UPDATE");
            $stmt->execute([$reqId]);
            $req = $stmt->fetch();

            if ($req) {
                $receiptAmount = (int)$req['amount'];
                $currentDebt = (int)$req['credit_debt'];
                $targetUserId = $req['user_id'];
                $debtPaid = 0;
                $netWalletAddition = 0;

                if ($currentDebt > 0) {
                    if ($receiptAmount <= $currentDebt) {
                        $debtPaid = $receiptAmount;
                        $netWalletAddition = 0;
                    } else {
                        $debtPaid = $currentDebt;
                        $netWalletAddition = $receiptAmount - $currentDebt;
                    }
                } else {
                    $netWalletAddition = $receiptAmount;
                }

                $bonusPercent = 0;
                $bonusAmount = 0;
                
                // بررسی مجدد بونوس برای کاربری که فیش او تایید می‌شود
                $isTargetBonusActive = $isBonusSystemActive;
                $stmtTargetSpecial = $pdo->prepare("SELECT allow_bonus FROM user_prices WHERE user_id = ?");
                $stmtTargetSpecial->execute([$targetUserId]);
                $targetBonusPerms = $stmtTargetSpecial->fetchAll(PDO::FETCH_COLUMN);
                
                if (count($targetBonusPerms) > 0) {
                    $hasBonusPermission = false;
                    foreach ($targetBonusPerms as $ab) {
                        if ($ab == 1) { $hasBonusPermission = true; break; }
                    }
                    if (!$hasBonusPermission) {
                        $isTargetBonusActive = false;
                    }
                }
                
                if ($isTargetBonusActive && $netWalletAddition > 0) {
                    foreach ($activeBonuses as $b) {
                        if ($netWalletAddition >= $b['min_amount']) {
                            $bonusPercent = $b['bonus_percent'];
                            $bonusAmount = ($netWalletAddition * $bonusPercent) / 100;
                            break; 
                        }
                    }
                }

                if ($debtPaid > 0) {
                    $pdo->prepare("UPDATE users SET credit_debt = credit_debt - ? WHERE id = ?")->execute([$debtPaid, $targetUserId]);
                }
                
                $totalToWallet = $netWalletAddition + $bonusAmount;
                if ($totalToWallet > 0) {
                    $pdo->prepare("UPDATE users SET wallet_balance = wallet_balance + ? WHERE id = ?")->execute([$totalToWallet, $targetUserId]);
                }

                if ($bonusAmount > 0) {
                    $pdo->prepare("INSERT INTO wallet_logs (user_id, type, amount, description) VALUES (?, 'bonus_add', ?, ?)")->execute([$targetUserId, $bonusAmount, "بونوس تشویقی $bonusPercent% برای شارژ خالص " . number_format($netWalletAddition) . " تومانی"]);
                }

                if ($debtPaid > 0 && $netWalletAddition == 0) {
                    $msg = "فیش تایید شد. مبلغ " . number_format($receiptAmount) . " تومان کاملاً بابت تسویه بدهی کسر شد و بونوسی تعلق نگرفت.";
                } elseif ($debtPaid > 0 && $netWalletAddition > 0) {
                    $msg = "فیش تایید شد. مبلغ " . number_format($debtPaid) . " تومان بابت بدهی کسر و مبلغ خالص (" . number_format($netWalletAddition) . " تومان)" . ($bonusAmount > 0 ? " همراه با " . number_format($bonusAmount) . " تومان بونوس" : "") . " به کیف پول افزوده شد.";
                } else {
                    $msg = "فیش تایید شد و مبلغ " . number_format($receiptAmount) . " تومان " . ($bonusAmount > 0 ? "+ " . number_format($bonusAmount) . " تومان بونوس " : "") . "به کیف پول کاربر اضافه گردید.";
                }

                $pdo->prepare("UPDATE settlements SET status = 'approved' WHERE id = ?")->execute([$reqId]);
                $pdo->commit();
            } else {
                $pdo->rollBack();
                $error = "درخواست نامعتبر است یا قبلا بررسی شده.";
            }
        } catch (Exception $e) {
            $pdo->rollBack();
            $error = "خطای سیستم در پردازش مالی کیف پول.";
        }
    }

    if ($_POST['action'] === 'reject_charge' && $isAdmin) {
        $reqId = (int)$_POST['req_id'];
        $pdo->prepare("UPDATE settlements SET status = 'rejected' WHERE id = ? AND status = 'pending'")->execute([$reqId]);
        $msg = "فیش واریزی رد شد و مبلغی به کیف پول یا بدهی اعمال نگردید.";
    }

    if ($_POST['action'] === 'allocate_credit' && $isAdmin) {
        $creditAmount = (int)str_replace(',', '', $_POST['credit_amount']);
        $targetId = (int)$_POST['target_user_id'];

        if ($creditAmount <= 0 || !$targetId) {
            $error = "مبلغ یا کاربر نامعتبر است.";
        } else {
            $pdo->prepare("UPDATE users SET wallet_balance = wallet_balance + ?, credit_debt = credit_debt + ? WHERE id = ?")->execute([$creditAmount, $creditAmount, $targetId]);
            $pdo->prepare("INSERT INTO wallet_logs (user_id, type, amount, description) VALUES (?, 'credit_add', ?, 'تخصیص خط اعتباری و بدهی')")->execute([$targetId, $creditAmount]);
            $msg = "شارژ اعتباری با موفقیت اعمال شد. موجودی و بدهی کاربر " . number_format($creditAmount) . " تومان افزایش یافت.";
        }
    }

    if ($_POST['action'] === 'manual_charge' && $isAdmin) {
        $chargeAmount = (int)str_replace(',', '', $_POST['manual_amount']);
        $chargeUserId = $_POST['target_user_id'];
        $chargeType = $_POST['charge_type'];

        if ($chargeAmount <= 0) {
            $error = "مبلغ وارد شده نامعتبر است.";
        } else {
            $logType = ($chargeType === 'add') ? 'manual_add' : 'manual_sub';
            
            if ($chargeUserId === 'all') {
                if ($chargeType === 'add') {
                    $pdo->prepare("UPDATE users SET wallet_balance = wallet_balance + ? WHERE role = 'operator'")->execute([$chargeAmount]);
                    $msg = "مبلغ " . number_format($chargeAmount) . " تومان به کیف پول تمامی اپراتورها اضافه شد.";
                } else {
                    $pdo->prepare("UPDATE users SET wallet_balance = wallet_balance - ? WHERE role = 'operator'")->execute([$chargeAmount]);
                    $msg = "مبلغ " . number_format($chargeAmount) . " تومان از کیف پول تمامی اپراتورها کسر شد.";
                }
                $pdo->prepare("INSERT INTO wallet_logs (user_id, type, amount, description) VALUES (0, ?, ?, 'اعمال گروهی برای تمامی نمایندگان')")->execute([$logType, $chargeAmount]);
            } else {
                $targetId = (int)$chargeUserId;
                $logDesc = ($chargeType === 'add') ? 'شارژ دستی کیف پول' : 'کسر دستی موجودی';
                
                if ($chargeType === 'add') {
                    $pdo->prepare("UPDATE users SET wallet_balance = wallet_balance + ? WHERE id = ?")->execute([$chargeAmount, $targetId]);
                    $msg = "کیف پول کاربر با موفقیت " . number_format($chargeAmount) . " تومان شارژ شد.";
                } else {
                    $pdo->prepare("UPDATE users SET wallet_balance = wallet_balance - ? WHERE id = ?")->execute([$chargeAmount, $targetId]);
                    $msg = "مبلغ " . number_format($chargeAmount) . " تومان از کیف پول کاربر کسر گردید.";
                }
                $pdo->prepare("INSERT INTO wallet_logs (user_id, type, amount, description) VALUES (?, ?, ?, ?)")->execute([$targetId, $logType, $chargeAmount, $logDesc]);
            }
        }
    }

    if ($_POST['action'] === 'update_global_emergency' && $isAdmin) {
        $globalAmount = (int)str_replace(',', '', $_POST['global_amount']);
        $pdo->prepare("UPDATE global_settings SET setting_value = ? WHERE setting_key = 'global_emergency_charge'")->execute([$globalAmount]);
        $msg = "سقف سراسری شارژ اضطراری با موفقیت بروزرسانی شد.";
    }

    if ($_POST['action'] === 'update_user_emergency' && $isAdmin) {
        $targetId = (int)$_POST['target_user_id'];
        $userAmount = trim($_POST['user_amount']);
        
        if ($userAmount === '') {
            $pdo->prepare("UPDATE users SET emergency_amount = NULL WHERE id = ?")->execute([$targetId]);
            $msg = "شارژ اضطراری اختصاصی نماینده لغو شد. اکنون از سقف سراسری استفاده می‌کند.";
        } else {
            $amount = (int)str_replace(',', '', $userAmount);
            $pdo->prepare("UPDATE users SET emergency_amount = ? WHERE id = ?")->execute([$amount, $targetId]);
            $msg = "سقف اختصاصی شارژ اضطراری برای نماینده مورد نظر ثبت شد.";
        }
    }

    if ($_POST['action'] === 'apply_emergency_charge' && !$isAdmin) {
        $stmtUser = $pdo->prepare("SELECT credit_debt, emergency_amount FROM users WHERE id = ? FOR UPDATE");
        $stmtUser->execute([$userId]);
        $u = $stmtUser->fetch();
        
        $gLimit = (int)$pdo->query("SELECT setting_value FROM global_settings WHERE setting_key = 'global_emergency_charge'")->fetchColumn();
        $effLimit = $u['emergency_amount'] !== null ? (int)$u['emergency_amount'] : $gLimit;

        if ($effLimit <= 0) {
            $error = "سیستم شارژ اضطراری در حال حاضر برای شما غیرفعال است.";
        } elseif ($u['credit_debt'] > 0) {
            $error = "⚠️ شما در حال حاضر دارای بدهی تسویه نشده هستید. تا زمان پرداخت بدهی فعلی (از طریق ثبت فیش و تسویه آن)، امکان دریافت مجدد شارژ اضطراری وجود ندارد.";
        } else {
            $pdo->prepare("UPDATE users SET wallet_balance = wallet_balance + ?, credit_debt = credit_debt + ? WHERE id = ?")->execute([$effLimit, $effLimit, $userId]);
            $pdo->prepare("INSERT INTO wallet_logs (user_id, type, amount, description) VALUES (?, 'credit_add', ?, 'دریافت شارژ اضطراری خودکار توسط نماینده')")->execute([$userId, $effLimit]);
            $msg = "شارژ اضطراری با موفقیت اعمال شد. مبلغ " . number_format($effLimit) . " تومان به موجودی اضافه و به عنوان بدهی اعتباری ثبت گردید.";
        }
    }
}

// ==========================================
// دریافت اطلاعات برای نمایش
// ==========================================
$globalEmergency = (int)$pdo->query("SELECT setting_value FROM global_settings WHERE setting_key = 'global_emergency_charge'")->fetchColumn();

if (!$isAdmin) {
    $stmtBalance = $pdo->prepare("SELECT wallet_balance, credit_debt, emergency_amount FROM users WHERE id = ?");
    $stmtBalance->execute([$userId]);
    $userData = $stmtBalance->fetch();
    $walletBalance = $userData['wallet_balance'] ?? 0;
    $creditDebt = $userData['credit_debt'] ?? 0;
    
    $effectiveEmergencyLimit = $userData['emergency_amount'] !== null ? (int)$userData['emergency_amount'] : $globalEmergency;

    $stmtHistory = $pdo->prepare("SELECT * FROM settlements WHERE user_id = ? ORDER BY id DESC");
    $stmtHistory->execute([$userId]);
    $history = $stmtHistory->fetchAll();
} else {
    $pendingRequests = $pdo->query("SELECT s.*, u.username, u.fullname, u.credit_debt FROM settlements s JOIN users u ON s.user_id = u.id WHERE s.status = 'pending' ORDER BY s.id ASC")->fetchAll();
    $allSettlementsAdmin = $pdo->query("SELECT s.*, u.username, u.fullname FROM settlements s JOIN users u ON s.user_id = u.id ORDER BY s.id DESC")->fetchAll();
    
    $manualLogsAdmin = $pdo->query("SELECT w.*, u.username, u.fullname FROM wallet_logs w LEFT JOIN users u ON w.user_id = u.id WHERE w.type IN ('manual_add', 'manual_sub', 'bonus_add') ORDER BY w.id DESC")->fetchAll();
    $creditLogsAdmin = $pdo->query("SELECT w.*, u.username, u.fullname FROM wallet_logs w LEFT JOIN users u ON w.user_id = u.id WHERE w.type = 'credit_add' ORDER BY w.id DESC")->fetchAll();
    
    $usersList = $pdo->query("SELECT id, username, fullname, wallet_balance, credit_debt, emergency_amount FROM users WHERE role = 'operator' ORDER BY wallet_balance DESC")->fetchAll();

    // محاسبه بدهی‌های کلان ادمین
    $totalCreditDebt = $pdo->query("SELECT SUM(credit_debt) FROM users WHERE role = 'operator'")->fetchColumn() ?: 0;
    
    $totalEmergencyAllocated = $pdo->query("SELECT SUM(amount) FROM wallet_logs WHERE type = 'credit_add' AND description LIKE '%اضطراری%'")->fetchColumn() ?: 0;
    
    $totalDebt = $totalCreditDebt;
}

require_once '../../includes/header.php';
?>

<script>
window.formatCurrency = function(input) {
    let value = input.value.replace(/,/g, '').replace(/\D/g, '');
    input.value = value ? Number(value).toLocaleString('en-US') : '';
};
document.addEventListener('input', function(e) {
    if (e.target && e.target.tagName === 'INPUT' && e.target.name && e.target.name.includes('amount')) {
        window.formatCurrency(e.target);
    }
});
</script>

<link rel="stylesheet" type="text/css" href="/vpnet-panel/assets/css/datatables.min.css">
<link rel="stylesheet" type="text/css" href="/vpnet-panel/assets/css/buttons.dataTables.min.css">

<style>
    .dataTables_wrapper .dataTables_filter input { border: 2px solid #e5e7eb; border-radius: 12px; padding: 8px 16px; outline: none; margin-bottom: 10px; }
    html.dark .dataTables_wrapper .dataTables_filter input { background-color: #0f172a; color: #f8fafc; border-color: #334155; }
    .dataTables_wrapper .dataTables_length select { border: 2px solid #e5e7eb; border-radius: 10px; padding: 5px; outline: none; }
    html.dark .dataTables_wrapper .dataTables_length select { background-color: #0f172a; color: #f8fafc; border-color: #334155; }
    html.dark .dataTables_wrapper .dataTables_info { color: #94a3b8 !important; }
    html.dark .dataTables_wrapper .dataTables_paginate .paginate_button { color: #94a3b8 !important; border-color: #334155 !important; }
</style>

<?php if($msg): ?><div class="bg-green-100 dark:bg-emerald-900/30 border border-green-400 dark:border-emerald-800 text-green-700 dark:text-emerald-400 px-4 py-3 rounded-xl mb-6 font-bold shadow-sm">✅ <?php echo $msg; ?></div><?php endif; ?>
<?php if($error): ?><div class="bg-red-100 dark:bg-rose-900/30 border border-red-400 dark:border-rose-800 text-red-700 dark:text-rose-400 px-4 py-3 rounded-xl mb-6 font-bold shadow-sm">❌ <?php echo $error; ?></div><?php endif; ?>

<?php 
// فراخوانی ویجت‌ها بر اساس نقش
if(!$isAdmin) {
    require_once 'widgets/operator_view.php';
} else {
    require_once 'widgets/admin_pending.php';
    require_once 'widgets/admin_actions.php';
    require_once 'widgets/admin_users_status.php';
    require_once 'widgets/admin_history.php';
}