<?php
require __DIR__ . '/config.php';

// --- التحقق من الاتصال ---
if (!isset($conn) || $conn->connect_error) {
    // استخدام die أفضل هنا لأن لا شيء سيعمل بدون اتصال
    die("❌ خطأ فادح: فشل الاتصال بقاعدة البيانات. الخطأ: " . ($conn->connect_error ?? 'Unknown error'));
}
// ضبط الترميز (احتياطي)
$conn->set_charset("utf8mb4");

$error = null;
$success = null;
$expiry_notice = null;
$edit_mode = false;
$edit_token_data = null;

// --- حذف التوكنات المنتهية عند تحميل الصفحة ---
// ملاحظة: هذا يحذف السجل بالكامل. إذا أردت فقط مسح التوكن، عد للـ UPDATE SET token = NULL
try {
    $delete_sql = "DELETE FROM api_tokens WHERE expires_at < NOW()";
    $delete_result = $conn->query($delete_sql);
    if ($delete_result === false) {
        throw new Exception("خطأ حذف التوكنات المنتهية: " . $conn->error);
    } elseif ($conn->affected_rows > 0) {
        $expiry_notice = "ℹ️ تم حذف " . $conn->affected_rows . " توكن/عميل منتهي الصلاحية.";
    }
} catch (Exception $e) {
    error_log($e->getMessage()); // تسجيل الخطأ للمطور
    $error = "حدث خطأ أثناء معالجة التوكنات المنتهية."; // رسالة عامة للمستخدم
}


// --- دالة توليد التوكن ---
function generateToken($length = 32) {
    try {
        return bin2hex(random_bytes($length));
    } catch (Exception $e) {
        // في حال فشل random_bytes (نادر جدًا)
        return md5(uniqid(mt_rand(), true));
    }
}

// --- معالجة إنشاء توكن جديد ---
if (isset($_POST['generate_new'])) {
    $user_domain = filter_var(trim($_POST['domain'] ?? ''), FILTER_SANITIZE_URL);
    $expiry_date_str = trim($_POST['expiry_date'] ?? '');
    $expires_at = null;

    if (empty($user_domain) || filter_var($user_domain, FILTER_VALIDATE_URL) === false) {
         // تحقق بسيط من شكل الرابط (يمكن تحسينه)
         // نحتاج لإزالة http/https والـ / في النهاية للمقارنة والتخزين
         $user_domain = preg_replace('#^https?://#', '', rtrim($user_domain, '/'));
         $user_domain = preg_replace('#^www\.#', '', $user_domain);
         if(empty($user_domain)) {
             $error = "❌ يرجى إدخال نطاق صالح (مثل example.com).";
         }
    }

    if (empty($expiry_date_str)) {
        $error = "❌ يرجى تحديد تاريخ انتهاء صالح.";
    } else {
        try {
             // محاولة تحويل التاريخ المدخل
             $date_obj = new DateTime($expiry_date_str);
             if (!$date_obj) throw new Exception("Invalid date format");
             // ضبط الوقت لنهاية اليوم لضمان تغطية اليوم بالكامل
             $expires_at = $date_obj->setTime(23, 59, 59)->format('Y-m-d H:i:s');
        } catch (Exception $e) {
            $error = "❌ صيغة تاريخ الانتهاء غير صالحة.";
            $expires_at = null; // تأكد من أنها null لفشل الشرط التالي
        }
    }

    if (!$error && $user_domain && $expires_at) {
        $token = generateToken();

        // استخدام INSERT فقط لمنع التحديث عند التكرار
        $stmt = $conn->prepare("INSERT INTO api_tokens (user_domain, token, expires_at) VALUES (?, ?, ?)");
        $stmt->bind_param("sss", $user_domain, $token, $expires_at);

        if (!$stmt->execute()) {
            // التحقق من خطأ المفتاح المكرر (MySQL error code 1062)
            if ($conn->errno == 1062) {
                $error = "❌ خطأ: النطاق '{$user_domain}' مسجل بالفعل.";
            } else {
                $error = "❌ خطأ أثناء إدخال البيانات: " . $stmt->error;
                error_log("Token Insert Error: " . $stmt->error); // تسجيل للمطور
            }
        } else {
            $success = "✅ تم إنشاء التوكن بنجاح!";
            $generated_token_info = [ // تخزين بيانات التوكن المولّد للعرض
                'token' => $token,
                'domain' => $user_domain,
                'expiry' => $expiry_date_str
            ];
        }
        $stmt->close();
    }
}

// --- معالجة تحديث بيانات عميل موجود ---
if (isset($_POST['update_existing'])) {
    $id = filter_var($_POST['edit_id'] ?? null, FILTER_VALIDATE_INT);
    $user_domain_edit = filter_var(trim($_POST['edit_domain'] ?? ''), FILTER_SANITIZE_URL);
    $token_edit = trim($_POST['edit_token'] ?? ''); // اسمح بتوكن فارغ (لإلغائه)
    $expiry_date_edit_str = trim($_POST['edit_expires_at'] ?? '');
    $expires_at_edit = null;

    // تنظيف الدومين
    $user_domain_edit = preg_replace('#^https?://#', '', rtrim($user_domain_edit, '/'));
    $user_domain_edit = preg_replace('#^www\.#', '', $user_domain_edit);

    if (!$id) {
        $error = "❌ المعرف غير صالح للتحديث.";
    } elseif (empty($user_domain_edit)) {
         $error = "❌ حقل النطاق لا يمكن أن يكون فارغًا.";
    } elseif (empty($expiry_date_edit_str)) {
        $error = "❌ يرجى تحديد تاريخ انتهاء صالح.";
    } else {
         try {
             $date_obj = new DateTime($expiry_date_edit_str);
             if (!$date_obj) throw new Exception("Invalid date format");
             $expires_at_edit = $date_obj->setTime(23, 59, 59)->format('Y-m-d H:i:s');
         } catch (Exception $e) {
             $error = "❌ صيغة تاريخ الانتهاء غير صالحة.";
         }
    }

    if (!$error && $id && $user_domain_edit && $expires_at_edit) {
        // اسمح بتحديث التوكن حتى لو كان فارغًا (لتعطيله يدويًا)
        $stmt = $conn->prepare("UPDATE api_tokens SET user_domain = ?, token = ?, expires_at = ? WHERE id = ?");
        // إذا كان التوكن فارغًا، أرسل NULL للقاعدة
        $token_to_save = !empty($token_edit) ? $token_edit : null;
        $stmt->bind_param("sssi", $user_domain_edit, $token_to_save, $expires_at_edit, $id);

        if (!$stmt->execute()) {
             // التحقق من خطأ المفتاح المكرر إذا حاول تغيير الدومين لدومين موجود آخر
             if ($conn->errno == 1062) {
                $error = "❌ خطأ: النطاق '{$user_domain_edit}' مسجل بالفعل لعميل آخر.";
             } else {
                $error = "❌ خطأ أثناء تحديث البيانات: " . $stmt->error;
                error_log("Token Update Error (ID: $id): " . $stmt->error);
             }
        } else {
            if ($stmt->affected_rows > 0) {
                $success = "✅ تم تحديث بيانات العميل بنجاح!";
            } else {
                $success = "ℹ️ لم يتم تغيير أي بيانات."; // Or no row found with that ID
            }
        }
        $stmt->close();
    }
}


// --- معالجة إعادة إصدار توكن ---
if (isset($_POST['renew_token'])) {
    $id = filter_var($_POST['id'] ?? null, FILTER_VALIDATE_INT);
    if ($id) {
        $new_token = generateToken();
        $stmt = $conn->prepare("UPDATE api_tokens SET token = ? WHERE id = ?");
        $stmt->bind_param("si", $new_token, $id);
        if ($stmt->execute() && $stmt->affected_rows > 0) {
             $success = "✅ تم إعادة إصدار التوكن بنجاح!";
        } else {
             $error = "❌ خطأ أثناء إعادة إصدار التوكن: " . $stmt->error;
             error_log("Token Renew Error (ID: $id): " . $stmt->error);
        }
        $stmt->close();
    } else {
         $error = "❌ معرف غير صالح لإعادة الإصدار.";
    }
}

// --- معالجة حذف توكن/عميل ---
if (isset($_POST['delete_token'])) {
    $id = filter_var($_POST['id'] ?? null, FILTER_VALIDATE_INT);
     if ($id) {
        $stmt = $conn->prepare("DELETE FROM api_tokens WHERE id = ?");
        $stmt->bind_param("i", $id);
        if ($stmt->execute() && $stmt->affected_rows > 0) {
            $success = "✅ تم حذف العميل بنجاح!";
        } else if ($stmt->affected_rows === 0) {
             $error = "ℹ️ لم يتم العثور على عميل بالمعرف المحدد للحذف.";
        } else {
             $error = "❌ خطأ أثناء حذف العميل: " . $stmt->error;
             error_log("Token Delete Error (ID: $id): " . $stmt->error);
        }
        $stmt->close();
    } else {
         $error = "❌ معرف غير صالح للحذف.";
    }
}

// --- التحضير لوضع التعديل (إذا تم طلبه عبر GET) ---
if (isset($_GET['action']) && $_GET['action'] === 'edit' && isset($_GET['id'])) {
    $edit_id = filter_var($_GET['id'], FILTER_VALIDATE_INT);
    if ($edit_id) {
        $stmt = $conn->prepare("SELECT * FROM api_tokens WHERE id = ?");
        $stmt->bind_param("i", $edit_id);
        $stmt->execute();
        $result = $stmt->get_result();
        if ($result->num_rows === 1) {
            $edit_token_data = $result->fetch_assoc();
            $edit_mode = true;
        } else {
            $error = "لم يتم العثور على العميل المحدد للتعديل.";
        }
        $stmt->close();
    } else {
         $error = "معرف العميل غير صالح للتعديل.";
    }
}


// --- جلب جميع التوكنات للعرض في الجدول ---
$tokens = []; // Initialize as empty array
try {
    $result = $conn->query("SELECT id, user_domain, token, expires_at FROM api_tokens ORDER BY id DESC");
    if ($result === false) {
        throw new Exception("خطأ جلب قائمة التوكنات: " . $conn->error);
    }
    $tokens = $result->fetch_all(MYSQLI_ASSOC);
    $result->free();
} catch (Exception $e) {
     error_log($e->getMessage());
     $error = $error ? $error . "<br>" : ""; // Add to existing error if any
     $error .= "حدث خطأ أثناء جلب قائمة العملاء.";
}
// $conn->close(); // لا تغلق الاتصال هنا إذا كنت لا تزال تستخدمه في config.php أو مكان آخر
?>

<!DOCTYPE html>
<html lang="ar">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>إدارة التوكنات</title>
    <style>
        body { font-family: sans-serif; direction: rtl; margin: 20px; background-color: #f8f9fa; color: #333; }
        .container { background: #fff; padding: 25px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); margin-bottom: 30px; }
        h2 { color: #007bff; border-bottom: 1px solid #eee; padding-bottom: 10px; margin-bottom: 20px; }
        form label { display: block; margin-bottom: 5px; font-weight: bold; text-align: right; }
        form input[type="text"], form input[type="url"], form input[type="date"], form input[type="datetime-local"] {
            width: 100%; padding: 10px; margin-bottom: 15px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box;
        }
        form button[type="submit"] {
            padding: 10px 20px; font-size: 16px; cursor: pointer; border: none; border-radius: 4px; color: white;
        }
        button[name="generate_new"] { background-color: #28a745; }
        button[name="update_existing"] { background-color: #007bff; }
        .error { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; padding: 10px; border-radius: 4px; margin: 15px 0; }
        .success { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; padding: 10px; border-radius: 4px; margin: 15px 0; }
        .notice { background-color: #fff3cd; color: #856404; border: 1px solid #ffeeba; padding: 10px; border-radius: 4px; margin: 15px 0; }
        .token-display { background: #e9ecef; padding: 8px; border-radius: 4px; display: inline-block; margin-top: 5px; font-family: monospace; word-break: break-all; }

        table { width: 100%; border-collapse: collapse; margin-top: 20px; background-color: #fff; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
        th, td { padding: 12px; border: 1px solid #dee2e6; text-align: right; vertical-align: middle; }
        th { background-color: #007bff; color: white; text-align: center; }
        td form { margin: 0; padding: 0; } /* Reset form margin inside td */
        .action-buttons form { display: inline-block; margin-left: 5px; }
        .action-buttons button { padding: 5px 10px; font-size: 14px; margin: 0; }
        .edit-btn-link { background: #17a2b8; color: white; text-decoration: none; padding: 5px 10px; border-radius: 4px; font-size: 14px;}
        .delete-btn { background: #dc3545; }
        .renew-btn { background: #ffc107; color: black; }
         /* Responsive adjustments */
         @media (max-width: 768px) {
            th, td { font-size: 12px; padding: 8px;}
            th:nth-child(1), td:nth-child(1) { /* Hide ID on small screens */ display: none; }
            th:nth-child(3), td:nth-child(3) { /* Shorten token column */ max-width: 100px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
            .action-buttons button, .edit-btn-link { display: block; margin-bottom: 5px; width: 100%; box-sizing: border-box; text-align: center;}
            form input[type="text"], form input[type="url"], form input[type="date"], form input[type="datetime-local"] { font-size: 14px;}
         }
    </style>
</head>
<body>

<h1>إدارة توكنات API</h1>

<?php if ($expiry_notice): ?><p class="notice"><?= htmlspecialchars($expiry_notice) ?></p><?php endif; ?>
<?php if ($error): ?><p class="error"><?= $error // HTML is allowed in error messages for formatting ?></p><?php endif; ?>
<?php if ($success): ?><p class="success"><?= htmlspecialchars($success) ?></p><?php endif; ?>

<div class="container">
    <h2>➕ إنشاء توكن جديد</h2>
    <form method="POST" action=""> <label for="domain">النطاق (الدومين):</label>
        <input type="url" id="domain" name="domain" placeholder="https://example.com" required value="<?= isset($_POST['domain']) && !$success ? htmlspecialchars($_POST['domain']) : ''; /* Preserve value on error */ ?>">

        <label for="expiry_date">تاريخ الانتهاء:</label>
        <input type="date" id="expiry_date" name="expiry_date" required value="<?= isset($_POST['expiry_date']) && !$success ? htmlspecialchars($_POST['expiry_date']) : ''; ?>">

        <button type="submit" name="generate_new">توليد وحفظ</button>
    </form>
    <?php if (isset($generated_token_info)): ?>
        <div style="margin-top: 15px; text-align: right;">
             <p><strong>التوكن للعميل <?= htmlspecialchars($generated_token_info['domain']) ?>:</strong> <br> <span class="token-display"><?= htmlspecialchars($generated_token_info['token']) ?></span></p>
             <p><strong>ينتهي في:</strong> <?= htmlspecialchars($generated_token_info['expiry']) ?></p>
        </div>
    <?php endif; ?>
</div>


<?php if ($edit_mode && $edit_token_data): ?>
<div class="container" id="edit-section">
    <h2>✏️ تعديل بيانات العميل (ID: <?= htmlspecialchars($edit_token_data['id']) ?>)</h2>
    <form method="POST" action=""> <input type="hidden" name="edit_id" value="<?= htmlspecialchars($edit_token_data['id']) ?>">

         <label for="edit_domain">النطاق (الدومين):</label>
         <input type="url" id="edit_domain" name="edit_domain" placeholder="https://example.com" required value="<?= htmlspecialchars($edit_token_data['user_domain']) ?>">

         <label for="edit_token">التوكن (اتركه فارغًا لإلغائه):</label>
         <input type="text" id="edit_token" name="edit_token" value="<?= htmlspecialchars($edit_token_data['token'] ?? '') ?>">

         <label for="edit_expires_at">تاريخ الانتهاء:</label>
         <?php
             // Format expiry for datetime-local input
             $expiry_edit_formatted = '';
             try {
                if(!empty($edit_token_data['expires_at'])) {
                    $dt = new DateTime($edit_token_data['expires_at']);
                    $expiry_edit_formatted = $dt->format('Y-m-d\TH:i'); // Format for datetime-local
                }
             } catch(Exception $e) { /* Ignore conversion error, leave empty */ }
         ?>
         <input type="datetime-local" id="edit_expires_at" name="edit_expires_at" required value="<?= $expiry_edit_formatted ?>">

         <button type="submit" name="update_existing">حفظ التعديلات</button>
         <a href="?" style="margin-right: 10px; text-decoration: none; color: #6c757d;">إلغاء</a> </form>
</div>
<?php endif; ?>


<div class="container">
    <h2>📜 العملاء المسجلون</h2>
    <?php if (!empty($tokens)): ?>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>الدومين</th>
                <th>التوكن</th>
                <th>تاريخ الانتهاء</th>
                <th style="text-align: center;">الإجراءات</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($tokens as $row): ?>
            <tr>
                <td style="text-align: center;"><?= htmlspecialchars($row['id']) ?></td>
                <td><?= htmlspecialchars($row['user_domain']) ?></td>
                <td>
                    <?php if ($row['token']): ?>
                        <span class="token-display" title="<?= htmlspecialchars($row['token']) ?>">...<?= htmlspecialchars(substr($row['token'], -8)) ?></span>
                    <?php else: ?>
                        <span style="color: #dc3545;">(ملغي/منتهي)</span>
                    <?php endif; ?>
                </td>
                <td><?= htmlspecialchars(date('Y-m-d H:i', strtotime($row['expires_at']))) // Format for display ?></td>
                <td class="action-buttons" style="text-align: center; white-space: nowrap;">
                     <a href="?action=edit&id=<?= htmlspecialchars($row['id']) ?>#edit-section" class="edit-btn-link">✏️ تعديل</a>

                     <form method="POST" action="" style="display: inline-block;">
                        <input type="hidden" name="id" value="<?= htmlspecialchars($row['id']) ?>">
                        <button type="submit" name="renew_token" class="renew-btn" title="إعادة إصدار توكن جديد لهذا العميل">🔄 إعادة إصدار</button>
                     </form>

                     <form method="POST" action="" style="display: inline-block;">
                        <input type="hidden" name="id" value="<?= htmlspecialchars($row['id']) ?>">
                        <button type="submit" name="delete_token" class="delete-btn" onclick="return confirm('⚠️ هل أنت متأكد من حذف هذا العميل والتوكن الخاص به؟');">🗑️ حذف</button>
                    </form>
                </td>
            </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
    <?php else: ?>
        <p>لا يوجد عملاء مسجلون حاليًا.</p>
    <?php endif; ?>
</div>

</body>
</html>