<?php
$page_title = 'دورة التحصيل والفوترة';
$UA_FORCE_DESIGN_V2 = true;
$UA_PAGE_CSS = ['assets/css/automation_billing.css'];

require_once __DIR__ . '/header.php';
require_once __DIR__ . '/billing_cycle_lib.php';
require_once __DIR__ . '/mikrotik_lib.php';

require_login();
if (function_exists('require_perm')) require_perm('can_settings');

billing_cycle_migrate($conn);

$message = '';
$error = '';
$runResult = null;
$view = trim((string)($_GET['view'] ?? 'cycle'));
$allowedViews = ['cycle', 'exceptional', 'approvals', 'quota', 'run'];
if (!in_array($view, $allowedViews, true)) $view = 'cycle';
$canRunQuota = !function_exists('has_perm') || has_perm('can_mikrotik_sync');
if (empty($_SESSION['billing_exceptional_cycle_token'])) {
  $_SESSION['billing_exceptional_cycle_token'] = bin2hex(random_bytes(24));
}
$exceptionalCycleToken = (string)$_SESSION['billing_exceptional_cycle_token'];

$speedKeys = ['1M', '2M', '4M', '8M', '16M'];
if (table_exists($conn, 'speeds')) {
  $speedRows = @$conn->query("SELECT DISTINCT speed_name FROM speeds WHERE COALESCE(speed_name,'')<>'' ORDER BY id ASC");
  if ($speedRows) {
    while ($speedRow = $speedRows->fetch_assoc()) {
      $speedName = strtoupper(trim((string)($speedRow['speed_name'] ?? '')));
      if (preg_match('/^([0-9]+(?:\.[0-9]+)?[KMG])/i', $speedName, $match)) {
        $speedKeys[] = strtoupper($match[1]);
      }
    }
  }
}
$speedKeys = array_values(array_unique($speedKeys));

if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {
  try {
    if (function_exists('ua_csrf_verify') && !ua_csrf_verify()) {
      throw new RuntimeException('انتهت صلاحية الطلب. أعد تحميل الصفحة ثم حاول مجدداً.');
    }

    $action = trim((string)($_POST['action'] ?? 'save'));
    if ($action === 'save') {
      $cycleDay = min(28, max(1, (int)($_POST['billing_cycle_day'] ?? 1)));
      $generationLead = min(28, max(0, (int)($_POST['billing_generation_lead_days'] ?? 3)));
      $dueAfter = min(60, max(0, (int)($_POST['billing_due_after_days'] ?? 0)));
      $graceDays = min(120, max(0, (int)($_POST['grace_days'] ?? 0)));
      $limitAfter = min(180, max(0, (int)($_POST['limit_after_days'] ?? 0)));
      $cutAfter = min(180, max(0, (int)($_POST['cut_after_days'] ?? 0)));
      $requestRetention = min(365, max(1, (int)($_POST['billing_request_retention_days'] ?? 3)));
      $cutInterval = min(1440, max(1, (int)($_POST['automation_cut_interval'] ?? 15)));
      // Payment reminders are a fixed due-date event. The calendar may still
      // preview the timeline, but saving always keeps the reminder on day 0.
      $reminderOffsets = [0];
      $remindersEnabled = isset($_POST['billing_reminders_enabled']);
      $limitEnabled = isset($_POST['billing_limit_enabled']);
      $cutStageEnabled = isset($_POST['billing_cut_stage_enabled']);

      if ($remindersEnabled && !$reminderOffsets) {
        throw new RuntimeException('فعّل يوماً واحداً على الأقل لرسائل التنبيه، أو عطّل مرحلة التنبيهات.');
      }
      $earliestPossibleOffset = -($generationLead + $dueAfter);
      if ($remindersEnabled && $reminderOffsets && min($reminderOffsets) < $earliestPossibleOffset) {
        throw new RuntimeException('يوجد تنبيه يسبق إنشاء الفاتورة. غيّر يوم التنبيه أو أنشئ الفاتورة بوقت أبكر.');
      }
      if ($limitEnabled && $cutStageEnabled && $cutAfter < $limitAfter) {
        throw new RuntimeException('موعد القطع يجب أن يكون بعد موعد التخفيض أو مساوياً له.');
      }

      set_app_setting($conn, 'automation_invoices_enabled', isset($_POST['automation_invoices_enabled']) ? '1' : '0');
      set_app_setting($conn, 'automation_cut_enabled', isset($_POST['automation_cut_enabled']) ? '1' : '0');
      set_app_setting($conn, 'billing_reminders_enabled', $remindersEnabled ? '1' : '0');
      set_app_setting($conn, 'billing_limit_enabled', $limitEnabled ? '1' : '0');
      set_app_setting($conn, 'billing_cut_stage_enabled', $cutStageEnabled ? '1' : '0');
      set_app_setting($conn, 'billing_skip_limit_stage', $limitEnabled ? '0' : '1');
      set_app_setting($conn, 'billing_cycle_day', (string)$cycleDay);
      set_app_setting($conn, 'billing_generation_lead_days', (string)$generationLead);
      set_app_setting($conn, 'billing_due_after_days', (string)$dueAfter);
      set_app_setting($conn, 'billing_reminder_offsets', implode(',', $reminderOffsets));
      set_app_setting($conn, 'grace_days', (string)$graceDays);
      set_app_setting($conn, 'limit_after_days', (string)$limitAfter);
      set_app_setting($conn, 'cut_after_days', (string)$cutAfter);
      set_app_setting($conn, 'billing_request_retention_days', (string)$requestRetention);
      set_app_setting($conn, 'automation_cut_interval', (string)$cutInterval);

      $message = 'تم حفظ دورة التحصيل وجدولها الزمني بنجاح.';
    } elseif ($action === 'save_quota') {
      $quotaInput = isset($_POST['quota_throttle']) && is_array($_POST['quota_throttle']) ? $_POST['quota_throttle'] : [];
      foreach ($speedKeys as $speedKey) {
        $value = trim((string)($quotaInput[$speedKey] ?? ''));
        set_app_setting($conn, 'quota_throttle_' . $speedKey, $value);
      }
      $message = 'تم حفظ سرعات ما بعد استهلاك الحصة بنجاح.';
    } elseif ($action === 'run_billing') {
      $generated = billing_generate_current_cycle_invoices($conn, false);
      $queued = billing_queue_requests($conn);
      $runResult = ['type' => 'billing', 'generated' => $generated, 'queued' => $queued];
      $message = 'اكتمل فحص دورة التحصيل وفق المواعيد المحفوظة.';
    } elseif ($action === 'create_exceptional_cycle') {
      $actorId = (int)($_SESSION['admin_id'] ?? $_SESSION['admin_user_id'] ?? $_SESSION['user_id'] ?? 0);
      $submittedToken = trim((string)($_POST['request_token'] ?? ''));
      if ($submittedToken === '' || !hash_equals($exceptionalCycleToken, $submittedToken)) {
        throw new RuntimeException('تعذر التحقق من طلب الدورة الاستثنائية. أعد تحميل الصفحة ثم حاول مجدداً.');
      }
      $exceptional = billing_create_exceptional_cycle(
        $conn,
        $actorId,
        trim((string)($_POST['exceptional_cycle_label'] ?? '')),
        $submittedToken
      );
      $queued = billing_queue_requests($conn);
      $runResult = ['type'=>'exceptional_cycle', 'generated'=>$exceptional, 'queued'=>$queued];
      if (empty($exceptional['ok'])) {
        throw new RuntimeException((string)($exceptional['error'] ?? 'تعذر إنشاء الدورة الاستثنائية.'));
      }
      $_SESSION['billing_exceptional_cycle_token'] = bin2hex(random_bytes(24));
      $exceptionalCycleToken = (string)$_SESSION['billing_exceptional_cycle_token'];
      $message = 'تم إنشاء الدورة الاستثنائية فوراً: ' . (int)($exceptional['created'] ?? 0) . ' فاتورة، وبدأ احتساب المهل المحفوظة دون تغيير موعد الدورة التلقائية.';
    } elseif ($action === 'run_quota') {
      if (!$canRunQuota) throw new RuntimeException('لا تملك صلاحية تنفيذ أوامر الشبكة.');
      $quotaResult = include __DIR__ . '/quota_runner.php';
      $runResult = ['type' => 'quota', 'result' => $quotaResult];
      $message = 'اكتمل فحص حصة الإنترنت وتطبيق الاستعادة أو التخفيض المطلوب.';
    }
  } catch (Throwable $e) {
    $error = $e->getMessage();
  }
}

$cfg = billing_get_settings($conn);
$previewCycle = billing_next_cycle($conn);
$alerts = billing_get_alert_payload($conn);
$cutInterval = min(1440, max(1, (int)get_app_setting($conn, 'automation_cut_interval', '15')));
$mtSettings = mt_get_settings($conn);
$defaultLimit = trim((string)($mtSettings['limit_speed'] ?? '512k/512k'));
$quotaValues = [];
foreach ($speedKeys as $speedKey) {
  $quotaValues[$speedKey] = (string)get_app_setting($conn, 'quota_throttle_' . $speedKey, '');
}
$recentExceptionalCycles = billing_recent_exceptional_cycles($conn, 6);
$exceptionalStartTs = strtotime(date('Y-m-d'));
$exceptionalDueTs = strtotime('+' . (int)$cfg['due_after_days'] . ' day', $exceptionalStartTs);
$exceptionalGraceTs = strtotime('+' . (int)$cfg['grace_days'] . ' day', $exceptionalDueTs);
$exceptionalLimitTs = strtotime('+' . (int)$cfg['limit_after_days'] . ' day', $exceptionalGraceTs);
$exceptionalCutTs = strtotime('+' . (int)$cfg['cut_after_days'] . ' day', $exceptionalGraceTs);

$calendarConfig = [
  'today' => date('Y-m-d'),
  'previewStart' => (string)$previewCycle['start_date'],
  'cycleDay' => (int)$cfg['cycle_day'],
  'generationLead' => (int)$cfg['generation_lead_days'],
  'dueAfter' => (int)$cfg['due_after_days'],
  'graceDays' => (int)$cfg['grace_days'],
  'reminderOffsets' => array_values($cfg['reminder_offsets']),
  'limitAfter' => (int)$cfg['limit_after_days'],
  'cutAfter' => (int)$cfg['cut_after_days'],
  'remindersEnabled' => !empty($cfg['reminders_enabled']),
  'limitEnabled' => !empty($cfg['limit_enabled']),
  'cutEnabled' => !empty($cfg['cut_stage_enabled']),
];
?>

<div class="content-wrapper ua-extracted-page abc-page" dir="rtl" data-abc-view="<?= h($view) ?>">
  <section class="content">
    <div class="container-fluid">
      <header class="abc-hero">
        <div class="abc-hero__icon"><i class="fa fa-calendar-check-o"></i></div>
        <div>
          <span>دورة واحدة · إعدادات واضحة</span>
          <h1>دورة التحصيل والفوترة</h1>
          <p>أنشئ الفاتورة، حدد أيام التنبيه، ثم اضبط التخفيض والقطع من تقويم واحد. لا يُرسل تنبيه ولا يُنفّذ إجراء مالي قبل الموافقة.</p>
        </div>
        <div class="abc-hero__status">
          <small>الدورة القادمة</small>
          <strong dir="ltr"><?= h($previewCycle['start_date']) ?></strong>
          <span><?= !empty($cfg['automation_invoices_enabled']) ? 'التوليد الآلي مفعّل' : 'التوليد الآلي متوقف' ?></span>
        </div>
      </header>

      <nav class="abc-jump" aria-label="صفحات دورة التحصيل">
        <a href="automation_billing.php?view=cycle" class="<?= $view === 'cycle' ? 'is-active' : '' ?>" <?= $view === 'cycle' ? 'aria-current="page"' : '' ?>><i class="fa fa-clock-o"></i> فترات السماح والقطع</a>
        <a href="automation_billing.php?view=exceptional" class="<?= $view === 'exceptional' ? 'is-active' : '' ?>" <?= $view === 'exceptional' ? 'aria-current="page"' : '' ?>><i class="fa fa-bolt"></i> دورة استثنائية</a>
        <a href="automation_billing.php?view=approvals" class="<?= $view === 'approvals' ? 'is-active' : '' ?>" <?= $view === 'approvals' ? 'aria-current="page"' : '' ?>><i class="fa fa-check-square-o"></i> الموافقات</a>
        <a href="automation_billing.php?view=quota" class="<?= $view === 'quota' ? 'is-active' : '' ?>" <?= $view === 'quota' ? 'aria-current="page"' : '' ?>><i class="fa fa-tachometer"></i> حصة الإنترنت</a>
        <a href="automation_billing.php?view=run" class="<?= $view === 'run' ? 'is-active' : '' ?>" <?= $view === 'run' ? 'aria-current="page"' : '' ?>><i class="fa fa-play"></i> الفحص والتنفيذ</a>
      </nav>

      <?php if (in_array($view, ['cycle', 'quota'], true)): ?>
      <form method="post" id="abcSettingsForm">
        <?php if (function_exists('ua_csrf_field')) ua_csrf_field(); ?>
        <input type="hidden" name="action" value="<?= $view === 'quota' ? 'save_quota' : 'save' ?>">
        <input type="hidden" name="billing_reminder_offsets" id="abcReminderOffsets" value="0">

        <?php if ($view === 'cycle'): ?>
        <section class="abc-panel" id="cycle">
          <div class="abc-panel__head">
            <div>
              <span>المحرك الرئيسي</span>
              <h2>مراحل دورة التحصيل</h2>
              <p>كل مرحلة مستقلة ويمكن تشغيلها أو إيقافها دون تغيير مواعيد المراحل الأخرى.</p>
            </div>
            <button class="abc-save" type="submit"><i class="fa fa-save"></i> حفظ الدورة</button>
          </div>

          <div class="abc-switches">
            <label class="abc-switch">
              <input type="checkbox" name="automation_invoices_enabled" <?= !empty($cfg['automation_invoices_enabled']) ? 'checked' : '' ?>>
              <span><i class="fa fa-file-text-o"></i></span>
              <b>توليد الفواتير تلقائياً</b>
              <small>فاتورة شهرية حسب سعر سرعة المشترك.</small>
            </label>
            <label class="abc-switch">
              <input type="checkbox" name="billing_reminders_enabled" id="abcRemindersEnabled" <?= !empty($cfg['reminders_enabled']) ? 'checked' : '' ?>>
              <span><i class="fa fa-bell-o"></i></span>
              <b>طلبات رسائل التنبيه</b>
              <small>يُنشأ طلب رسالة التسديد في يوم الاستحقاق فقط.</small>
            </label>
            <label class="abc-switch">
              <input type="checkbox" name="automation_cut_enabled" <?= !empty($cfg['automation_cut_enabled']) ? 'checked' : '' ?>>
              <span><i class="fa fa-shield"></i></span>
              <b>طلبات إجراءات الديون</b>
              <small>إنشاء طلبات التخفيض والقطع عند موعدها.</small>
            </label>
            <label class="abc-switch">
              <input type="checkbox" name="billing_limit_enabled" id="abcLimitEnabled" <?= !empty($cfg['limit_enabled']) ? 'checked' : '' ?>>
              <span><i class="fa fa-tachometer"></i></span>
              <b>مرحلة تخفيض السرعة</b>
              <small>ألغها للانتقال من السماح إلى القطع مباشرة.</small>
            </label>
            <label class="abc-switch">
              <input type="checkbox" name="billing_cut_stage_enabled" id="abcCutEnabled" <?= !empty($cfg['cut_stage_enabled']) ? 'checked' : '' ?>>
              <span><i class="fa fa-ban"></i></span>
              <b>مرحلة القطع</b>
              <small>تنشئ طلب قطع ينتظر موافقة السوبر أدمن.</small>
            </label>
          </div>

          <div class="abc-fields">
            <label><span>يوم بداية الدورة</span><input id="abcCycleDay" name="billing_cycle_day" type="number" min="1" max="28" value="<?= (int)$cfg['cycle_day'] ?>"><small>من 1 إلى 28 شهرياً</small></label>
            <label><span>إنشاء الفاتورة قبل الدورة</span><div class="abc-unit"><input id="abcGenerationLead" name="billing_generation_lead_days" type="number" min="0" max="28" value="<?= (int)$cfg['generation_lead_days'] ?>"><b>يوم</b></div><small>وقت كافٍ للتنبيه قبل الاستحقاق</small></label>
            <label><span>الاستحقاق بعد بداية الدورة</span><div class="abc-unit"><input id="abcDueAfter" name="billing_due_after_days" type="number" min="0" max="60" value="<?= (int)$cfg['due_after_days'] ?>"><b>يوم</b></div><small>يبدأ منه حساب السماح</small></label>
            <label><span>مدة السماح بعد الاستحقاق</span><div class="abc-unit"><input id="abcGraceDays" name="grace_days" type="number" min="0" max="120" value="<?= (int)$cfg['grace_days'] ?>"><b>يوم</b></div><small>لا تخفيض ولا قطع خلالها</small></label>
            <label><span>التخفيض بعد انتهاء السماح</span><div class="abc-unit"><input id="abcLimitAfter" name="limit_after_days" type="number" min="0" max="180" value="<?= (int)$cfg['limit_after_days'] ?>"><b>يوم</b></div><small>صفر يعني نفس يوم انتهاء السماح</small></label>
            <label><span>القطع بعد انتهاء السماح</span><div class="abc-unit"><input id="abcCutAfter" name="cut_after_days" type="number" min="0" max="180" value="<?= (int)$cfg['cut_after_days'] ?>"><b>يوم</b></div><small>يجب ألا يسبق التخفيض عند تفعيله</small></label>
            <label><span>تنبيه الطلب المعلّق بعد</span><div class="abc-unit"><input name="billing_request_retention_days" type="number" min="1" max="365" value="<?= (int)$cfg['request_retention_days'] ?>"><b>يوم</b></div><small>للعرض والمتابعة، ولا يحذف الطلب</small></label>
            <label><span>تكرار فحص الدورة</span><div class="abc-unit"><input name="automation_cut_interval" type="number" min="1" max="1440" value="<?= (int)$cutInterval ?>"><b>دقيقة</b></div><small>الفحص لا يتجاوز الموافقة</small></label>
          </div>

          <div class="abc-planner">
            <div class="abc-planner__tools">
              <div>
                <span>التقويم التفاعلي</span>
                <h3>ضع المواعيد مباشرة على الأيام</h3>
                <p>اختر نوع الموعد ثم اضغط على يوم في التقويم.</p>
              </div>
              <div class="abc-mode" role="group" aria-label="أداة التقويم">
                <button type="button" class="is-active" data-calendar-mode="reminder"><i class="fa fa-bell"></i> يوم الاستحقاق</button>
                <button type="button" data-calendar-mode="limit"><i class="fa fa-tachometer"></i> يوم التخفيض</button>
                <button type="button" data-calendar-mode="cut"><i class="fa fa-ban"></i> يوم القطع</button>
              </div>
            </div>
            <div class="abc-reminder-strip">
              <b>موعد رسالة التسديد</b>
              <div id="abcReminderChips"></div>
            </div>
            <div class="abc-calendar" id="abcCalendar" aria-live="polite"></div>
            <div class="abc-timeline" id="abcTimeline"></div>
            <p class="abc-calendar__hint" id="abcCalendarHint">رسالة التسديد مثبتة تلقائياً على يوم الاستحقاق.</p>
          </div>
        </section>
        <?php endif; ?>

        <?php if ($view === 'quota'): ?>
        <section class="abc-panel" id="quota">
          <div class="abc-panel__head">
            <div>
              <span>محرك مستقل عن الديون</span>
              <h2>تخفيض السرعة عند نفاد حصة الإنترنت</h2>
              <p>هذه الإعدادات تخص استهلاك حجم الباقة فقط، ولا علاقة لها بتأخر سداد الفاتورة.</p>
            </div>
          </div>
          <div class="abc-quota-grid">
            <?php foreach ($speedKeys as $speedKey): ?>
              <label>
                <span>السرعة الأساسية <b dir="ltr"><?= h($speedKey) ?></b></span>
                <input dir="ltr" name="quota_throttle[<?= h($speedKey) ?>]" value="<?= h($quotaValues[$speedKey]) ?>" placeholder="<?= h($defaultLimit) ?>">
                <small>سرعة ما بعد استهلاك الحصة، واتركها فارغة لاستخدام الافتراضي.</small>
              </label>
            <?php endforeach; ?>
          </div>
          <div class="abc-panel__foot"><a href="quota_setup.php"><i class="fa fa-database"></i> إعداد أحجام الباقات والقص</a></div>
        </section>
        <?php endif; ?>

        <div class="abc-savebar">
          <div><i class="fa fa-info-circle"></i><span><?= $view === 'quota' ? 'الحفظ يغيّر سرعة ما بعد استهلاك الحصة فقط.' : 'الحفظ يحدّث فترات الدورة والتقويم، ولا ينفّذ قطعاً أو تخفيضاً فورياً.' ?></span></div>
          <button class="abc-save" type="submit"><i class="fa fa-save"></i> <?= $view === 'quota' ? 'حفظ إعدادات الحصة' : 'حفظ فترات الدورة' ?></button>
        </div>
      </form>
      <?php endif; ?>

      <?php if ($view === 'approvals'): ?>
        <section class="abc-panel" id="approvals">
          <div class="abc-panel__head">
            <div><span>بوابة السوبر أدمن</span><h2>طلبات الموافقة المعلّقة</h2><p>تبقى الرسائل والتخفيض والقطع في الانتظار حتى اعتمادها.</p></div>
          </div>
          <div class="abc-approvals">
            <a href="billing_message_requests.php"><i class="fa fa-envelope-o"></i><span><small>رسائل التسديد</small><strong><?= (int)($alerts['pending']['reminder'] ?? 0) ?></strong></span><em>عرض الطلبات</em></a>
            <a href="billing_limit_requests.php"><i class="fa fa-tachometer"></i><span><small>طلبات التخفيض</small><strong><?= (int)($alerts['pending']['limit'] ?? 0) ?></strong></span><em>عرض الطلبات</em></a>
            <a href="billing_cut_requests.php"><i class="fa fa-ban"></i><span><small>طلبات القطع</small><strong><?= (int)($alerts['pending']['cut'] ?? 0) ?></strong></span><em>عرض الطلبات</em></a>
            <a href="packages_prices.php"><i class="fa fa-tags"></i><span><small>مشتركون بلا تسعير سرعة</small><strong><?= (int)($alerts['generation']['pricing_missing'] ?? 0) ?></strong></span><em>ضبط الأسعار</em></a>
          </div>
        </section>
      <?php endif; ?>

      <?php if ($view === 'exceptional'): ?>
      <section class="abc-panel abc-exceptional" id="exceptional">
        <div class="abc-panel__head">
          <div>
            <span>دورة مستقلة لا تغيّر الجدول الآلي</span>
            <h2>إنشاء دورة فواتير استثنائية</h2>
            <p>تنشئ فواتير أساسية فوراً لجميع المشتركين النشطين، ثم تبدأ مهل التنبيه والتخفيض والقطع المحفوظة من تاريخ اليوم.</p>
          </div>
          <div class="abc-exceptional__badge"><i class="fa fa-shield"></i><span>الدورة التلقائية تبقى في موعدها</span></div>
        </div>

        <div class="abc-exceptional__grid">
          <form method="post" id="abcExceptionalCycleForm" class="abc-exceptional__form">
            <?php if (function_exists('ua_csrf_field')) ua_csrf_field(); ?>
            <input type="hidden" name="action" value="create_exceptional_cycle">
            <input type="hidden" name="request_token" value="<?= h($exceptionalCycleToken) ?>">
            <label>
              <span>اسم الدورة <small>اختياري</small></span>
              <input name="exceptional_cycle_label" maxlength="80" placeholder="مثال: تسوية استثنائية لشهر آب">
            </label>
            <div class="abc-exceptional__scope"><i class="fa fa-users"></i><span><b>النطاق</b> جميع المشتركين النشطين غير الموقوفين مؤقتاً</span></div>
            <button type="submit"><i class="fa fa-bolt"></i><span>إنشاء الدورة الآن</span><small>إنشاء فوري وبدء المهل</small></button>
          </form>

          <div class="abc-exceptional__policy">
            <h3><i class="fa fa-clock-o"></i> المواعيد التي ستثبت لهذه الدورة</h3>
            <div class="abc-exceptional__timeline">
              <span><i class="fa fa-file-text-o"></i><small>إنشاء الفواتير</small><b dir="ltr"><?= h(date('Y-m-d', $exceptionalStartTs)) ?></b></span>
              <span><i class="fa fa-calendar-check-o"></i><small>الاستحقاق</small><b dir="ltr"><?= h(date('Y-m-d', $exceptionalDueTs)) ?></b></span>
              <span><i class="fa fa-hourglass-half"></i><small>نهاية السماح</small><b dir="ltr"><?= h(date('Y-m-d', $exceptionalGraceTs)) ?></b></span>
              <?php if (!empty($cfg['automation_cut_enabled']) && !empty($cfg['limit_enabled']) && empty($cfg['skip_limit_stage'])): ?>
                <span><i class="fa fa-tachometer"></i><small>طلب التخفيض</small><b dir="ltr"><?= h(date('Y-m-d', $exceptionalLimitTs)) ?></b></span>
              <?php endif; ?>
              <?php if (!empty($cfg['automation_cut_enabled']) && !empty($cfg['cut_stage_enabled'])): ?>
                <span><i class="fa fa-ban"></i><small>طلب القطع</small><b dir="ltr"><?= h(date('Y-m-d', $exceptionalCutTs)) ?></b></span>
              <?php endif; ?>
            </div>
            <p><i class="fa fa-info-circle"></i> الفواتير الناتجة تستخدم أزرار التسديد وإلغاء التسديد والطباعة والاستعادة نفسها، وتدخل طلبات الرسائل والإجراءات عبر بوابة الموافقات الحالية.</p>
          </div>
        </div>

        <?php if ($recentExceptionalCycles): ?>
          <div class="abc-exceptional__history">
            <h3>آخر الدورات الاستثنائية</h3>
            <div>
              <?php foreach ($recentExceptionalCycles as $exceptionalCycle):
                $cycleStatus = (string)($exceptionalCycle['status'] ?? '');
                $cycleStatusLabel = $cycleStatus === 'completed' ? 'مكتملة' : ($cycleStatus === 'partial' ? 'جزئية' : ($cycleStatus === 'failed' ? 'فشلت' : 'قيد الإنشاء'));
              ?>
                <article class="is-<?= h($cycleStatus) ?>">
                  <header><b><?= h($exceptionalCycle['label'] ?? ('دورة #' . (int)$exceptionalCycle['id'])) ?></b><span><?= h($cycleStatusLabel) ?></span></header>
                  <div><small>أُنشئت</small><strong><?= (int)($exceptionalCycle['created_invoices'] ?? 0) ?></strong><small>مغطاة برصيد</small><strong><?= (int)($exceptionalCycle['covered_by_credit'] ?? 0) ?></strong><small>بلا تسعير</small><strong><?= (int)($exceptionalCycle['pricing_missing'] ?? 0) ?></strong></div>
                  <footer><time dir="ltr"><?= h($exceptionalCycle['created_at'] ?? '') ?></time><a href="invoices.php"><i class="fa fa-external-link"></i> الفواتير</a></footer>
                </article>
              <?php endforeach; ?>
            </div>
          </div>
        <?php endif; ?>
      </section>
      <?php endif; ?>

      <?php if ($view === 'run'): ?>
      <section class="abc-panel" id="run">
        <div class="abc-panel__head">
          <div><span>بديل صفحة «تنفيذ الآن»</span><h2>الفحص والتنفيذ اليدوي</h2><p>الأمران منفصلان بوضوح: فحص التحصيل ينشئ الطلبات فقط، وفحص الحصة قد يطبق السرعة على MikroTik.</p></div>
        </div>
        <div class="abc-run-grid">
          <form method="post">
            <?php if (function_exists('ua_csrf_field')) ua_csrf_field(); ?>
            <input type="hidden" name="action" value="run_billing">
            <i class="fa fa-refresh"></i><h3>فحص دورة التحصيل الآن</h3>
            <p>يفحص مواعيد اليوم، ويولّد الفواتير المستحقة وينشئ طلبات الموافقة فقط.</p>
            <button type="submit"><i class="fa fa-play"></i> تشغيل الفحص</button>
          </form>
          <form method="post" id="abcQuotaRunForm">
            <?php if (function_exists('ua_csrf_field')) ua_csrf_field(); ?>
            <input type="hidden" name="action" value="run_quota">
            <i class="fa fa-exchange"></i><h3>فحص حصة الإنترنت الآن</h3>
            <p>يقرأ الاستهلاك ويطبق التخفيض أو يعيد السرعة للمشتركين على MikroTik.</p>
            <button type="submit" <?= $canRunQuota ? '' : 'disabled' ?>><i class="fa fa-bolt"></i> تنفيذ فحص الحصة</button>
          </form>
        </div>
        <?php if (is_array($runResult)): ?>
          <pre class="abc-run-result" dir="ltr"><?= h(json_encode($runResult, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)) ?></pre>
        <?php endif; ?>
      </section>
      <?php endif; ?>
    </div>
  </section>
</div>

<?php if ($message !== '' || $error !== ''): ?>
  <div class="abc-toast <?= $error !== '' ? 'is-error' : 'is-success' ?>" role="status">
    <i class="fa <?= $error !== '' ? 'fa-exclamation-triangle' : 'fa-check-circle' ?>"></i>
    <span><?= h($error !== '' ? $error : $message) ?></span>
    <button type="button" aria-label="إغلاق"><i class="fa fa-times"></i></button>
  </div>
<?php endif; ?>

<script id="abcCalendarConfig" type="application/json"><?= json_encode($calendarConfig, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?></script>
<script src="<?= h(ua_asset_versioned_local('assets/js/automation_billing.js')) ?>"></script>
<?php require_once __DIR__ . '/footer.php'; ?>
