<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);

if (!isset($_SESSION['admin'])) {
    header("Location: admin_login.php");
    exit();
}

$conn = new mysqli("localhost", "nassrrkx_Asovtu", "nassrrkx_Asovtu", "nassrrkx_Asovtu");
if ($conn->connect_error) {
    die("DB Error");
}

$conn->set_charset("utf8mb4");

/* HELPERS */
function h($v){
    return htmlspecialchars((string)($v ?? ''), ENT_QUOTES, 'UTF-8');
}

function naira($v){
    return number_format((float)($v ?? 0), 2);
}

function isAjaxRequest(): bool {
    return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
           strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}

function getStatusBadgeHtml(string $status): string {
    $s = strtolower(trim($status));

    if ($s === 'successful') {
        return "<span class='px-2 py-1 bg-green-500/20 text-green-400 rounded-full text-xs'>Successful</span>";
    } elseif ($s === 'failed') {
        return "<span class='px-2 py-1 bg-red-500/20 text-red-400 rounded-full text-xs'>Failed</span>";
    } elseif ($s === 'processing') {
        return "<span class='px-2 py-1 bg-blue-500/20 text-blue-400 rounded-full text-xs'>Processing</span>";
    } elseif ($s === 'in progress') {
        return "<span class='px-2 py-1 bg-orange-500/20 text-orange-400 rounded-full text-xs'>In Progress</span>";
    } else {
        return "<span class='px-2 py-1 bg-yellow-500/20 text-yellow-400 rounded-full text-xs'>Pending</span>";
    }
}

function getRefundHtml(array $row): string {
    $id = (int)($row['id'] ?? 0);
    $status = strtolower((string)($row['status'] ?? ''));
    $refunded = (int)($row['refunded'] ?? 0);

    if ($refunded === 1) {
        return '<span class="text-green-400 text-xs">Refunded 80%</span>';
    }

    if ($status === 'failed') {
        return '
            <form method="post" class="refund-form">
                <input type="hidden" name="id" value="' . $id . '">
                <button name="refund" class="bg-red-500 px-3 py-1 rounded text-xs hover:bg-red-600">
                    Refund 80%
                </button>
            </form>
        ';
    }

    return '-';
}

/* STATUS LIST */
$allowedStatuses = [
    'Pending',
    'In Progress',
    'Processing',
    'Successful',
    'Failed'
];

/* UPDATE */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update'])) {
    $id = (int)($_POST['id'] ?? 0);
    $status = trim((string)($_POST['status'] ?? 'Pending'));
    $reply = trim((string)($_POST['reply'] ?? ''));

    if (!in_array($status, $allowedStatuses, true)) {
        $status = 'Pending';
    }

    $stmt = $conn->prepare("UPDATE validation_requests SET status=?, reply=? WHERE id=?");
    $stmt->bind_param("ssi", $status, $reply, $id);
    $ok = $stmt->execute();
    $stmt->close();

    if (isAjaxRequest()) {
        $row = null;
        $q = $conn->prepare("SELECT id, status, refunded FROM validation_requests WHERE id=? LIMIT 1");
        $q->bind_param("i", $id);
        $q->execute();
        $row = $q->get_result()->fetch_assoc();
        $q->close();

        header('Content-Type: application/json');
        echo json_encode([
            'success' => $ok,
            'message' => $ok ? 'Request updated successfully.' : 'Update failed.',
            'status' => $status,
            'status_badge' => getStatusBadgeHtml($status),
            'refund_html' => $row ? getRefundHtml($row) : '-',
            'reply' => $reply
        ]);
        exit;
    }

    header("Location: " . $_SERVER['PHP_SELF']);
    exit;
}

/* REFUND - 80% */
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['refund'])) {
    $id = (int)($_POST['id'] ?? 0);

    $q = $conn->prepare("SELECT id, user, price, status, refunded FROM validation_requests WHERE id=? LIMIT 1");
    $q->bind_param("i", $id);
    $q->execute();
    $row = $q->get_result()->fetch_assoc();
    $q->close();

    $success = false;
    $message = 'Refund could not be processed.';

    if ($row && strtolower((string)$row['status']) === 'failed' && (int)$row['refunded'] === 0) {
        $user = (string)$row['user'];
        $price = (float)$row['price'];
        $statusBeforeRefund = (string)$row['status'];
        $refundPercent = 80.00;
        $refundAmount = round($price * 0.80, 2);
        $note = '80% refund for failed validation request';

        $conn->begin_transaction();

        try {
            $bal = $conn->prepare("UPDATE balance SET amount = amount + ? WHERE user = ?");
            $bal->bind_param("ds", $refundAmount, $user);
            $bal->execute();
            $bal->close();

            $upd = $conn->prepare("UPDATE validation_requests SET refunded = 1 WHERE id = ?");
            $upd->bind_param("i", $id);
            $upd->execute();
            $upd->close();

            $ins = $conn->prepare("
                INSERT INTO refund_transactions
                (validation_request_id, user, original_amount, refund_percent, refund_amount, request_status, note)
                VALUES (?, ?, ?, ?, ?, ?, ?)
            ");
            $ins->bind_param(
                "isdddss",
                $id,
                $user,
                $price,
                $refundPercent,
                $refundAmount,
                $statusBeforeRefund,
                $note
            );
            $ins->execute();
            $ins->close();

            $conn->commit();
            $success = true;
            $message = 'Refund processed successfully.';
        } catch (Throwable $e) {
            $conn->rollback();
            $success = false;
            $message = 'Refund failed.';
        }
    }

    if (isAjaxRequest()) {
        header('Content-Type: application/json');
        echo json_encode([
            'success' => $success,
            'message' => $message,
            'refund_html' => $success
                ? '<span class="text-green-400 text-xs">Refunded 80%</span>'
                : (isset($row) && $row ? getRefundHtml($row) : '-')
        ]);
        exit;
    }

    header("Location: " . $_SERVER['PHP_SELF']);
    exit;
}

/* FETCH */
$res = $conn->query("SELECT * FROM validation_requests ORDER BY id DESC");

/* STATS */
$stats = [
    'today' => ['count' => 0, 'spent' => 0],
    'week'  => ['count' => 0, 'spent' => 0],
    'month' => ['count' => 0, 'spent' => 0],
    'total' => ['count' => 0, 'spent' => 0],
];

$statsSql = "
    SELECT
        SUM(CASE WHEN DATE(created_at) = CURDATE() THEN 1 ELSE 0 END) AS today_count,
        SUM(CASE WHEN DATE(created_at) = CURDATE() THEN price ELSE 0 END) AS today_spent,

        SUM(CASE WHEN YEARWEEK(created_at, 1) = YEARWEEK(CURDATE(), 1) THEN 1 ELSE 0 END) AS week_count,
        SUM(CASE WHEN YEARWEEK(created_at, 1) = YEARWEEK(CURDATE(), 1) THEN price ELSE 0 END) AS week_spent,

        SUM(CASE WHEN YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) THEN 1 ELSE 0 END) AS month_count,
        SUM(CASE WHEN YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) THEN price ELSE 0 END) AS month_spent,

        COUNT(*) AS total_count,
        SUM(price) AS total_spent
    FROM validation_requests
";

$statsRes = $conn->query($statsSql);

if ($statsRes instanceof mysqli_result) {
    $s = $statsRes->fetch_assoc();

    if ($s) {
        $stats['today']['count'] = (int)($s['today_count'] ?? 0);
        $stats['today']['spent'] = (float)($s['today_spent'] ?? 0);

        $stats['week']['count'] = (int)($s['week_count'] ?? 0);
        $stats['week']['spent'] = (float)($s['week_spent'] ?? 0);

        $stats['month']['count'] = (int)($s['month_count'] ?? 0);
        $stats['month']['spent'] = (float)($s['month_spent'] ?? 0);

        $stats['total']['count'] = (int)($s['total_count'] ?? 0);
        $stats['total']['spent'] = (float)($s['total_spent'] ?? 0);
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Validation Admin</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>

<body class="bg-gradient-to-br from-slate-900 via-blue-900 to-slate-800 text-white">
<div class="max-w-7xl mx-auto p-6">

    <h1 class="text-3xl font-bold mb-6">📋 Validation Dashboard</h1>

    <div id="toast"
         class="hidden fixed top-5 right-5 z-50 min-w-[220px] max-w-sm px-4 py-3 rounded-lg shadow-lg text-sm font-semibold transition-all duration-300 opacity-0 -translate-y-2">
    </div>

    <!-- STATS -->
    <div class="grid md:grid-cols-4 gap-4 mb-6">

        <div class="bg-blue-600 p-5 rounded-xl shadow">
            <div class="text-lg font-semibold mb-2">Today</div>
            <div class="text-sm">Today Count: <?= $stats['today']['count'] ?></div>
            <div class="text-sm">Today Spent: ₦<?= naira($stats['today']['spent']) ?></div>
        </div>

        <div class="bg-green-600 p-5 rounded-xl shadow">
            <div class="text-lg font-semibold mb-2">Weekly</div>
            <div class="text-sm">Weekly Count: <?= $stats['week']['count'] ?></div>
            <div class="text-sm">Weekly Spent: ₦<?= naira($stats['week']['spent']) ?></div>
        </div>

        <div class="bg-purple-600 p-5 rounded-xl shadow">
            <div class="text-lg font-semibold mb-2">Monthly</div>
            <div class="text-sm">Monthly Count: <?= $stats['month']['count'] ?></div>
            <div class="text-sm">Monthly Spent: ₦<?= naira($stats['month']['spent']) ?></div>
        </div>

        <div class="bg-orange-600 p-5 rounded-xl shadow">
            <div class="text-lg font-semibold mb-2">Total</div>
            <div class="text-sm">Total Count: <?= $stats['total']['count'] ?></div>
            <div class="text-sm">Total Spent: ₦<?= naira($stats['total']['spent']) ?></div>
        </div>

    </div>

    <!-- TABLE -->
    <div class="bg-white/10 backdrop-blur-xl rounded-2xl overflow-x-auto">
        <table class="min-w-full text-sm">
            <thead class="border-b border-gray-700 text-gray-300">
                <tr>
                    <th class="p-3">User</th>
                    <th>NIN</th>
                    <th>Price</th>
                    <th>Status</th>
                    <th>Refund</th>
                    <th>Action</th>
                </tr>
            </thead>

            <tbody>
            <?php while($r = $res->fetch_assoc()): ?>
                <tr class="border-b border-gray-700 hover:bg-white/5 transition" data-row-id="<?= (int)$r['id'] ?>">
                    <td class="p-3"><?= h($r['user']) ?></td>
                    <td><?= h($r['nin']) ?></td>

                    <td class="text-green-400 font-semibold">
                        ₦<?= naira($r['price']) ?>
                    </td>

                    <td class="status-cell">
                        <?= getStatusBadgeHtml((string)$r['status']) ?>
                    </td>

                    <td class="refund-cell">
                        <?= getRefundHtml($r) ?>
                    </td>

                    <td>
                        <form method="post" class="space-y-1 update-form">
                            <input type="hidden" name="id" value="<?= (int)$r['id'] ?>">

                            <select name="status" class="w-full p-1 rounded bg-black/30 text-xs">
                                <option value="Pending" <?= strtolower((string)$r['status']) === 'pending' ? 'selected' : '' ?>>Pending</option>
                                <option value="In Progress" <?= strtolower((string)$r['status']) === 'in progress' ? 'selected' : '' ?>>In Progress</option>
                                <option value="Processing" <?= strtolower((string)$r['status']) === 'processing' ? 'selected' : '' ?>>Processing</option>
                                <option value="Successful" <?= strtolower((string)$r['status']) === 'successful' ? 'selected' : '' ?>>Successful</option>
                                <option value="Failed" <?= strtolower((string)$r['status']) === 'failed' ? 'selected' : '' ?>>Failed</option>
                            </select>

                            <textarea
                                name="reply"
                                placeholder="Reply..."
                                class="w-full p-1 rounded bg-black/30 text-xs"
                            ><?= h($r['reply'] ?? '') ?></textarea>

                            <button
                                type="submit"
                                name="update"
                                class="w-full bg-blue-600 hover:bg-blue-700 text-xs p-1 rounded"
                            >
                                Update
                            </button>
                        </form>
                    </td>
                </tr>
            <?php endwhile; ?>
            </tbody>
        </table>
    </div>

</div>

<script>
function showToast(message, type = 'success') {
    const toast = document.getElementById('toast');

    toast.textContent = message;
    toast.classList.remove(
        'hidden',
        'bg-green-600',
        'bg-red-600',
        'bg-orange-600',
        'text-white',
        'opacity-0',
        '-translate-y-2'
    );

    if (type === 'success') {
        toast.classList.add('bg-green-600', 'text-white');
    } else if (type === 'error') {
        toast.classList.add('bg-red-600', 'text-white');
    } else {
        toast.classList.add('bg-orange-600', 'text-white');
    }

    toast.classList.add('opacity-100', 'translate-y-0');

    clearTimeout(toast.hideTimeout);
    toast.hideTimeout = setTimeout(() => {
        toast.classList.remove('opacity-100', 'translate-y-0');
        toast.classList.add('opacity-0', '-translate-y-2');

        setTimeout(() => {
            toast.classList.add('hidden');
        }, 300);
    }, 2500);
}

function bindUpdateForms() {
    document.querySelectorAll('.update-form').forEach(form => {
        if (form.dataset.bound === '1') return;
        form.dataset.bound = '1';

        form.addEventListener('submit', async function(e) {
            e.preventDefault();

            const row = form.closest('tr');
            const statusCell = row.querySelector('.status-cell');
            const refundCell = row.querySelector('.refund-cell');
            const submitBtn = form.querySelector('button[name="update"]');
            const formData = new FormData(form);
            formData.append('update', '1');

            submitBtn.disabled = true;
            submitBtn.textContent = 'Updating...';

            try {
                const response = await fetch('', {
                    method: 'POST',
                    headers: {
                        'X-Requested-With': 'XMLHttpRequest'
                    },
                    body: formData
                });

                const data = await response.json();

                if (data.success) {
                    statusCell.innerHTML = data.status_badge;
                    refundCell.innerHTML = data.refund_html;
                    bindRefundForms();
                    showToast(data.message || 'Request updated successfully.', 'success');
                } else {
                    showToast(data.message || 'Update failed.', 'error');
                }
            } catch (error) {
                showToast('Network error occurred.', 'error');
            } finally {
                submitBtn.disabled = false;
                submitBtn.textContent = 'Update';
            }
        });
    });
}

function bindRefundForms() {
    document.querySelectorAll('.refund-form').forEach(form => {
        if (form.dataset.bound === '1') return;
        form.dataset.bound = '1';

        form.addEventListener('submit', async function(e) {
            e.preventDefault();

            if (!confirm('Refund 80% for this failed request?')) {
                return;
            }

            const row = form.closest('tr');
            const refundCell = row.querySelector('.refund-cell');
            const button = form.querySelector('button[name="refund"]');
            const formData = new FormData(form);
            formData.append('refund', '1');

            button.disabled = true;
            button.textContent = 'Processing...';

            try {
                const response = await fetch('', {
                    method: 'POST',
                    headers: {
                        'X-Requested-With': 'XMLHttpRequest'
                    },
                    body: formData
                });

                const data = await response.json();

                if (data.success) {
                    refundCell.innerHTML = data.refund_html;
                    showToast(data.message || 'Refund processed successfully.', 'success');
                } else {
                    button.disabled = false;
                    button.textContent = 'Refund 80%';
                    showToast(data.message || 'Refund failed.', 'error');
                }
            } catch (error) {
                button.disabled = false;
                button.textContent = 'Refund 80%';
                showToast('Network error occurred.', 'error');
            }
        });
    });
}

bindUpdateForms();
bindRefundForms();
</script>
</body>
</html>
