<?php
// admin/maintenance.php
if (session_status() === PHP_SESSION_NONE) session_start();
if (!ob_get_level()) ob_start();

$page_title = 'صيانة النظام';

// Use the admin bootstrap; parent config may point to a different DB service.
require_once __DIR__ . '/db_bootstrap.php';
if (function_exists('ensure_db')) {
  ensure_db(true);
}
require_once __DIR__ . '/helpers.php';
require_once __DIR__ . '/db_schema_helpers.php';
require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/lang.php';

require_login();

// صلاحية (إن وجدت)
if (function_exists('require_permission')) {
  @require_permission('can_maintenance');
} elseif (function_exists('require_perm')) {
  @require_perm('can_maintenance');
}

$conn = $GLOBALS['conn'] ?? ($conn ?? null);
if (!($conn instanceof mysqli)) {
  die("خطأ: اتصال قاعدة البيانات غير جاهز");
}
mysqli_report(MYSQLI_REPORT_OFF);

/* ---------- helpers ---------- */
function safe_truncate(mysqli $conn, string $table): bool {
  if (!table_exists($conn, $table)) return true;
  return (bool)@$conn->query("TRUNCATE TABLE `$table`");
}
function safe_delete_all(mysqli $conn, string $table): bool {
  if (!table_exists($conn, $table)) return true;
  return (bool)@$conn->query("DELETE FROM `$table`");
}

function current_admin_username(): string {
  return (string)($_SESSION['admin_username'] ?? $_SESSION['admin_user'] ?? 'admin');
}

/**
 * ✅ تحقق كلمة المرور للأدمن الحالي
 * يدعم:
 * - عمود password_hash (SHA2)
 * - أو عمود password (plain legacy)
 */
function verify_admin_password(mysqli $conn, string $username, string $password): bool {
  if (!table_exists($conn, 'admin_users')) return false;

  $u = $conn->real_escape_string($username);
  $res = @$conn->query("SELECT * FROM admin_users WHERE username='$u' LIMIT 1");
  if (!$res || !$res->num_rows) return false;
  $row = $res->fetch_assoc();

  // password_hash (SHA2 used in our setup scripts)
  if (isset($row['password_hash']) && $row['password_hash']) {
    $passEsc = $conn->real_escape_string($password);
    $chk = @$conn->query("SELECT id FROM admin_users WHERE username='$u' AND password_hash=SHA2('$passEsc',256) LIMIT 1");
    return (bool)($chk && $chk->num_rows);
  }

  // legacy plain password
  if (isset($row['password']) && $row['password'] !== null) {
    return hash_equals((string)$row['password'], (string)$password);
  }

  return false;
}

/**
 * ✅ Backup SQL via PHP (بديل mysqldump)
 */
function db_backup_sql(mysqli $conn, string $savePath): bool {
  $conn->set_charset("utf8mb4");

  $sql = "-- ISP Admin Backup\n";
  $sql .= "-- Generated at: " . date('Y-m-d H:i:s') . "\n\n";
  $tables = [];

  $rs = @$conn->query("SHOW TABLES");
  if (!$rs) return false;
  while ($row = $rs->fetch_array()) $tables[] = $row[0];

  foreach ($tables as $table) {
    $crt = @$conn->query("SHOW CREATE TABLE `$table`");
    if ($crt) {
      $r = $crt->fetch_assoc();
      $createSql = $r['Create Table'] ?? '';
      $sql .= "DROP TABLE IF EXISTS `$table`;\n";
      $sql .= $createSql . ";\n\n";
    }

    $data = @$conn->query("SELECT * FROM `$table`");
    if ($data && $data->num_rows) {
      while ($d = $data->fetch_assoc()) {
        $cols = array_map(fn($c) => "`$c`", array_keys($d));
        $vals = array_map(function($v) use ($conn){
          if ($v === null) return "NULL";
          return "'" . $conn->real_escape_string((string)$v) . "'";
        }, array_values($d));
        $sql .= "INSERT INTO `$table` (" . implode(',', $cols) . ") VALUES (" . implode(',', $vals) . ");\n";
      }
      $sql .= "\n";
    }
  }

  return file_put_contents($savePath, $sql) !== false;
}

/**
 * ✅ مسح البيانات التشغيلية فقط
 * يبقي:
 * - company_info
 * - mikrotik_settings / sms_settings / whatsapp_app_settings / whatsapp_settings
 * - admin_users (المستخدمين والصلاحيات)
 * - app_settings (اللغة/العملة... إلخ)
 * - message_templates (القوالب)
 * ويمسح:
 * - subscribers / invoices
 * - message_logs
 * - agents / agent_transactions
 * - shop_* (مبيعات/مشتريات/مرتجعات/دفعات)
 */
function wipe_operational(mysqli $conn): array {
  $errors = [];

  // تشغيلية
  $tablesToTruncate = [
    'subscribers',
    'invoices',
    'message_logs',

    'agents',
    'agent_transactions',

    'shop_sales',
    'shop_sale_items',
    'shop_purchases',
    'shop_purchase_items',
    'shop_items',
    'shop_returns',
    'shop_payments',
  ];

  foreach ($tablesToTruncate as $t) {
    if (!safe_truncate($conn, $t)) $errors[] = "فشل مسح جدول: $t";
  }

  return $errors;
}

/**
 * ✅ Factory Reset:
 * - يمسح كل البيانات (تشغيلية + قوالب/إعدادات اختيارية حسب رغبتك)
 * - لا يحذف الجداول
 * - يمسح admin_users ليظهر setup_first_admin
 * - يبقي إعدادات الشبكة + بيانات الشركة؟ (هنا سنعيد الشركة افتراضية ونبقي إعدادات الشبكة)
 */
function factory_reset(mysqli $conn): array {
  $errors = [];

  // 1) امسح التشغيلية
  $errors = array_merge($errors, wipe_operational($conn));

  // 2) (اختياري) مسح سجلات فقط إضافية إن وجدت
  // مثال: logs أخرى
  safe_truncate($conn, 'audit_logs');

  // 3) أبقِ إعدادات الشبكة كما هي (لا نلمس mikrotik_settings / sms_settings / whatsapp...)
  // 4) أعِد الشركة افتراضي (يبقى الهيكل)
  if (table_exists($conn, 'company_info')) {
    @$conn->query("UPDATE company_info SET company_name='اسم الشركة', owner_name='عماد خميس' WHERE id=1");
  }

  // 5) امسح المستخدمين بالكامل حتى تظهر صفحة الإعداد
  if (!safe_truncate($conn, 'admin_users')) $errors[] = "فشل مسح جدول admin_users";

  return $errors;
}

/* ---------- actions ---------- */
$msg = '';
$err = '';
$download_link = '';

if (isset($_POST['do_backup'])) {
  $backupDir = __DIR__ . '/../backups';
  if (!is_dir($backupDir)) @mkdir($backupDir, 0777, true);

  $file = $backupDir . '/backup_' . date('Ymd_His') . '.sql';
  if (db_backup_sql($conn, $file)) {
    $msg = "تم إنشاء النسخة الاحتياطية بنجاح ✅";
    // رابط تحميل بسيط (ضع ملف download_backup.php إذا تريد تحميل مباشر)
    $download_link = "backups/" . basename($file);
  } else {
    $err = "تعذر إنشاء النسخة الاحتياطية (فشل تصدير SQL).";
  }
}

if (isset($_POST['do_wipe_operational'])) {
  $password = (string)($_POST['admin_password'] ?? '');
  $user = current_admin_username();

  if (!verify_admin_password($conn, $user, $password)) {
    $err = "كلمة المرور غير صحيحة.";
  } else {
    $errors = wipe_operational($conn);
    if ($errors) {
      $err = implode("<br>", array_map('h', $errors));
    } else {
      $msg = "تم مسح البيانات التشغيلية بنجاح ✅ (ستلاحظ أن الصفحات أصبحت فارغة).";
    }
  }
}

if (isset($_POST['do_factory_reset'])) {
  $password = (string)($_POST['admin_password_factory'] ?? '');
  $confirm  = (string)($_POST['confirm_text'] ?? '');
  $user = current_admin_username();

  if ($confirm !== 'FACTORY') {
    $err = "اكتب FACTORY لتأكيد العملية.";
  } elseif (!verify_admin_password($conn, $user, $password)) {
    $err = "كلمة المرور غير صحيحة.";
  } else {
    $errors = factory_reset($conn);
    if ($errors) {
      $err = implode("<br>", array_map('h', $errors));
    } else {
      // ✅ تحويل إلى شاشة إعداد أول Admin
      header("Location: setup_first_admin.php?force=1");
      exit;
    }
  }
}

/* ---------- UI ---------- */
$UA_FORCE_DESIGN_V2 = true;
$uaAndroidMaintenance = ((string)($_GET['ua_android'] ?? '') === '1') || stripos((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 'NetworkCustomersAndroid/') !== false;
if ($uaAndroidMaintenance) $UA_PAGE_CSS = ['assets/css/android_maintenance.css'];
include __DIR__ . '/header.php';
include __DIR__ . '/sidebar.php';
if ($uaAndroidMaintenance) { require __DIR__ . '/android_maintenance.php'; include __DIR__ . '/footer.php'; return; }
?>

<div class="content-wrapper ua-extracted-page">
  <section class="content-header">
    <div class="container-fluid d-flex justify-content-between align-items-center">
      <h1 class="mb-0"><?= function_exists('t') ? t('صيانة النظام') : 'صيانة النظام' ?></h1>
      <a href="dashboard.php" class="btn btn-secondary"><i class="fa fa-arrow-right"></i> <?= function_exists('t') ? t('رجوع') : 'رجوع' ?></a>
    </div>
  </section>

  <section class="content">
    <div class="container-fluid">

      <?php if($msg){ ?><div class="alert alert-success"><?= h($msg) ?></div><?php } ?>
      <?php if($err){ ?><div class="alert alert-danger"><?= $err ?></div><?php } ?>

      <?php if($download_link){ ?>
        <div class="alert alert-info">
          ملف النسخة الاحتياطية: <b><?= h($download_link) ?></b>
          <div class="mt-2">
            (إذا لم يُفتح، انسخ المسار وضعه بعد موقعك: <code>/mikrotik/<?= h($download_link) ?></code>)
          </div>
        </div>
      <?php } ?>

      <div class="row">

        <!-- Backup -->
        <div class="col-md-6">
          <div class="card">
            <div class="card-header"><b>النسخة الاحتياطية</b></div>
            <div class="card-body">
              <p class="text-muted mb-2">يتم إنشاء ملف SQL داخل مجلد <code>backups/</code> بدون الحاجة إلى mysqldump.</p>
              <form method="post">
                <button class="btn btn-primary" name="do_backup" value="1">
                  <i class="fa fa-download"></i> إنشاء نسخة احتياطية
                </button>
              </form>
            </div>
          </div>
        </div>

        <!-- Operational wipe -->
        <div class="col-md-6">
          <div class="card">
            <div class="card-header"><b>مسح البيانات التشغيلية</b></div>
            <div class="card-body">
              <p class="text-muted">
                يمسح: المشتركين، الفواتير، سجلات الرسائل، المبيعات، المشتريات، المعتمدين…<br>
                <b>ولا يمسح:</b> بيانات الشركة، إعدادات الشبكة، المستخدمين والصلاحيات، قوالب الرسائل، إعدادات البرنامج.
              </p>
              <form method="post">
                <div class="form-group">
                  <label>كلمة مرور الأدمن الحالي</label>
                  <input type="password" class="form-control" name="admin_password" required>
                </div>
                <button class="btn btn-warning" name="do_wipe_operational" value="1"
                        onclick="return confirm('تأكيد مسح البيانات التشغيلية؟');">
                  <i class="fa fa-eraser"></i> مسح البيانات التشغيلية
                </button>
              </form>
            </div>
          </div>
        </div>

        <!-- Factory reset -->
        <div class="col-12">
          <div class="card border-danger">
            <div class="card-header bg-danger text-white"><b>Factory Reset (إعادة ضبط المصنع)</b></div>
            <div class="card-body">
              <p class="text-white bg-danger p-2 ua-u-rounded-8">
                ⚠️ هذه العملية تمسح البيانات بالكامل (بدون حذف الجداول) ثم تمسح المستخدمين تلقائيًا وتحوّلك إلى شاشة إعداد أول مستخدم.
              </p>

              <form method="post" class="row">
                <div class="col-md-4">
                  <label>كلمة مرور الأدمن الحالي</label>
                  <input type="password" class="form-control" name="admin_password_factory" required>
                </div>

                <div class="col-md-4">
                  <label>اكتب FACTORY للتأكيد</label>
                  <input type="text" class="form-control" name="confirm_text" placeholder="FACTORY" required>
                </div>

                <div class="col-md-4 d-flex align-items-end">
                  <button class="btn btn-danger w-100" name="do_factory_reset" value="1"
                          onclick="return confirm('تأكيد FACTORY RESET؟');">
                    <i class="fa fa-trash"></i> Factory Reset
                  </button>
                </div>
              </form>

              <div class="alert alert-info mt-3 mb-0">
                <b>ملاحظة:</b> بعد المسح ستكون بعض الصفحات فارغة، وعند الدخول إليها يجب أن تُظهر رسالة مثل:
                “لا يوجد مشتركين / لا يوجد فواتير …” حسب الحالة.
              </div>

            </div>
          </div>
        </div>

      </div><!-- /row -->

    </div>
  </section>
</div>

<?php include __DIR__ . '/footer.php'; ?>
