<?php
$page_title = 'إعدادات الكروت';

$UA_FORCE_DESIGN_V2 = true;
$uaAndroidVoucherSettings = ((string)($_GET['ua_android'] ?? '') === '1')
  || stripos((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 'NetworkCustomersAndroid/') !== false;
if ($uaAndroidVoucherSettings) $UA_PAGE_CSS = ['assets/css/android_vouchers_settings.css'];
require_once __DIR__ . '/header.php';
require_once __DIR__ . '/sidebar.php';

require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/db_bootstrap.php';
require_once __DIR__ . '/helpers.php';
require_once __DIR__ . '/settings_store.php';

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

$conn = ensure_db(true);
settings_ensure_table($conn);

$msg=''; $err='';

// CSRF
if (empty($_SESSION['csrf_token'])) $_SESSION['csrf_token'] = bin2hex(random_bytes(16));
$csrf = $_SESSION['csrf_token'];

function csrf_check(): void {
  $sent = (string)($_POST['csrf_token'] ?? '');
  $sess = (string)($_SESSION['csrf_token'] ?? '');
  if ($sent === '' || $sess === '' || !hash_equals($sess, $sent)) {
    throw new RuntimeException('رمز الحماية غير صحيح. حدّث الصفحة وحاول مجددًا.');
  }
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  try {
    csrf_check();

    $voucher_hotspot_profile = trim((string)($_POST['voucher_hotspot_profile'] ?? 'voucher'));
    if ($voucher_hotspot_profile === '') $voucher_hotspot_profile = 'voucher';

    $auto_export_on_print = isset($_POST['auto_export_on_print']) ? '1' : '0';
    $default_paper = strtoupper(trim((string)($_POST['voucher_default_paper'] ?? 'A4')));
    if (!in_array($default_paper, ['A4','80MM','58MM'], true)) $default_paper = 'A4';

    $code_prefix = trim((string)($_POST['voucher_code_prefix'] ?? ''));
    $code_len = (int)($_POST['voucher_code_length'] ?? 8);
    if ($code_len < 4) $code_len = 4;
    if ($code_len > 32) $code_len = 32;

    setting_set($conn, 'voucher_hotspot_profile', $voucher_hotspot_profile);
    setting_set($conn, 'voucher_auto_export_on_print', $auto_export_on_print);
    setting_set($conn, 'voucher_default_paper', $default_paper);
    setting_set($conn, 'voucher_code_prefix', $code_prefix);
    setting_set($conn, 'voucher_code_length', (string)$code_len);

    $voucher_time_wallclock = isset($_POST['voucher_time_wallclock']) ? '1' : '0';
    setting_set($conn, 'voucher_time_wallclock', $voucher_time_wallclock);

    // Accounting settings
    $voucher_acct_enabled = isset($_POST['voucher_acct_enabled']) ? '1' : '0';
    $voucher_acct_endpoint_url = trim((string)($_POST['voucher_acct_endpoint_url'] ?? ''));
    $voucher_acct_secret = trim((string)($_POST['voucher_acct_secret'] ?? ''));
    $voucher_acct_interval = trim((string)($_POST['voucher_acct_interval'] ?? '5m'));
    if ($voucher_acct_interval === '') $voucher_acct_interval = '5m';
    $voucher_acct_allowed_ips = trim((string)($_POST['voucher_acct_allowed_ips'] ?? ''));

    setting_set($conn, 'voucher_acct_enabled', $voucher_acct_enabled);
    setting_set($conn, 'voucher_acct_endpoint_url', $voucher_acct_endpoint_url);
    setting_set($conn, 'voucher_acct_secret', $voucher_acct_secret);
    setting_set($conn, 'voucher_acct_interval', $voucher_acct_interval);
    setting_set($conn, 'voucher_acct_allowed_ips', $voucher_acct_allowed_ips);

    $msg = 'تم حفظ إعدادات الكروت ✅';
  } catch(Throwable $e) {
    $err = $e->getMessage();
  }
}

$voucher_hotspot_profile = (string)setting_get($conn, 'voucher_hotspot_profile', 'voucher');
$voucher_auto_export_on_print = (string)setting_get($conn, 'voucher_auto_export_on_print', '1');
$voucher_default_paper = (string)setting_get($conn, 'voucher_default_paper', 'A4');
$voucher_code_prefix = (string)setting_get($conn, 'voucher_code_prefix', '');
$voucher_code_length = (int)setting_get($conn, 'voucher_code_length', '8');
$voucher_time_wallclock = (string)setting_get($conn, 'voucher_time_wallclock', '1');

$voucher_acct_enabled = (string)setting_get($conn, 'voucher_acct_enabled', '0');
$voucher_acct_endpoint_url = (string)setting_get($conn, 'voucher_acct_endpoint_url', '');
$voucher_acct_secret = (string)setting_get($conn, 'voucher_acct_secret', '');
$voucher_acct_interval = (string)setting_get($conn, 'voucher_acct_interval', '5m');
$voucher_acct_allowed_ips = (string)setting_get($conn, 'voucher_acct_allowed_ips', '');

if ($uaAndroidVoucherSettings) {
  require __DIR__ . '/android_vouchers_settings.php';
  require_once __DIR__ . '/footer.php';
  return;
}
?>
<div class="content-wrapper ua-extracted-page">
  <section class="content-header"><div class="container-fluid d-flex align-items-center justify-content-between">
    <h1 class="mb-0">إعدادات الكروت</h1>
  </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"><?= h($err) ?></div><?php }?>

    <div class="card"><div class="card-body">
      <form method="post">
        <input type="hidden" name="csrf_token" value="<?= h($csrf) ?>">

        <div class="row">
          <div class="col-md-4">
            <label>Hotspot Profile الافتراضي (عند ترك بروفايل الصنف فارغ)</label>
            <input class="form-control" name="voucher_hotspot_profile" value="<?= h($voucher_hotspot_profile) ?>" placeholder="voucher">
            <small class="text-muted"></small>
          </div>

          <div class="col-md-3">
            <label>ورق الطباعة الافتراضي</label>
            <select class="form-control" name="voucher_default_paper">
              <option value="A4" <?= $voucher_default_paper==='A4'?'selected':'' ?>>A4</option>
              <option value="80MM" <?= $voucher_default_paper==='80MM'?'selected':'' ?>>80mm</option>
              <option value="58MM" <?= $voucher_default_paper==='58MM'?'selected':'' ?>>58mm</option>
            </select>
          </div>

          <div class="col-md-2">
            <label>بادئة الكود (اختياري)</label>
            <input class="form-control" name="voucher_code_prefix" value="<?= h($voucher_code_prefix) ?>" placeholder="مثال: IM-">
          </div>

          <div class="col-md-2">
            <label>طول الكود</label>
            <input class="form-control" type="number" name="voucher_code_length" value="<?= (int)$voucher_code_length ?>" min="4" max="32">
          </div>

          <div class="col-md-1 d-flex align-items-end">
            <div class="form-check">
              <input class="form-check-input" type="checkbox" id="ae" name="auto_export_on_print" <?= $voucher_auto_export_on_print==='1'?'checked':'' ?>>
              <label class="form-check-label" for="ae">تصدير عند أول طباعة</label>
            </div>
          </div>
        </div>

          <div class="col-md-12 mt-3">
            <div class="form-check">
              <input class="form-check-input" type="checkbox" id="vwc" name="voucher_time_wallclock" <?= $voucher_time_wallclock==='1'?'checked':'' ?>>
              <label class="form-check-label" for="vwc">مدة الكرت من أول تسجيل دخول</label>
              <div class="text-muted small">عند التفعيل: الوقت يستمر حتى لو فصل المستخدم، ويتم الاعتماد على Scheduler داخل MikroTik. عند الإلغاء: يتم استخدام limit-uptime (وقت اتصال فقط).</div>
            </div>
          </div>

          <div class="col-12 mt-4">
            <hr>
            <h5 class="mb-2">Accounting للكروت (مثل User Manager)</h5>
            <div class="text-muted small mb-3">
              هذا الخيار يجعل MikroTik يرسل Counters (Bytes) بشكل دوري إلى النظام لتقارير أدق وقطع تلقائي عند بلوغ حجم الكرت.
              <b>مهم:</b> ضع رابط الـ Endpoint كاملاً (يمكن أن يكون IP السيرفر على الشبكة) ثم ثبت السكربت على MikroTik.
            </div>

            <div class="row">
              <div class="col-md-3">
                <div class="form-check mt-2">
                  <input class="form-check-input" type="checkbox" id="vae" name="voucher_acct_enabled" <?= $voucher_acct_enabled==='1'?'checked':'' ?>>
                  <label class="form-check-label" for="vae">تفعيل Accounting</label>
                </div>
              </div>
              <div class="col-md-6">
                <label>رابط Endpoint</label>
                <input class="form-control" name="voucher_acct_endpoint_url" value="<?= h($voucher_acct_endpoint_url) ?>" placeholder="http://SERVER-IP/yourapp/admin/voucher_accounting_endpoint.php">
              </div>
              <div class="col-md-3">
                <label>Interval</label>
                <input class="form-control" name="voucher_acct_interval" value="<?= h($voucher_acct_interval) ?>" placeholder="5m">
                <small class="text-muted">مثال: 1m, 5m, 10m</small>
              </div>
            </div>

            <div class="row mt-2">
              <div class="col-md-6">
                <label>Secret</label>
                <div class="input-group">
                  <input class="form-control" id="acctSecret" name="voucher_acct_secret" value="<?= h($voucher_acct_secret) ?>" placeholder="سِرّ للحماية">
                  <button class="btn btn-outline-secondary" type="button" id="genSecret">توليد</button>
                </div>
              </div>
              <div class="col-md-6">
                <label>Allowed Router IPs (اختياري)</label>
                <input class="form-control" name="voucher_acct_allowed_ips" value="<?= h($voucher_acct_allowed_ips) ?>" placeholder="10.30.99.1, 10.30.99.2">
                <small class="text-muted">اتركه فارغًا للسماح للجميع (غير مُستحسن).</small>
              </div>
            </div>
          </div>

        <div class="mt-3">
          <button class="btn btn-primary">حفظ</button>
          <button type="button" id="btnInstallAcct" class="btn btn-outline-success ms-2">تثبيت Accounting على MikroTik</button>
        </div>
      </form>
    </div></div>

    <div class="alert alert-info">
      <div><b>ملاحظة:</b> “تصدير عند أول طباعة” يمنع تكرار إنشاء نفس الكروت على MikroTik عند إعادة الطباعة.</div>
    </div>

    <div class="card border-warning">
      <div class="card-header bg-warning">
        <b>ترقية الكروت القديمة</b>
      </div>
      <div class="card-body">
        <p class="mb-2">
          إذا كان لديك كروت قديمة تم إنشاؤها على MikroTik باستخدام <code>limit-uptime</code> (وقت اتصال فقط)،
          يمكنك تحويلها إلى النظام الجديد <b>durm/rem</b> بحيث تبدأ المدة من أول تسجيل دخول وتستمر حتى لو فصل المستخدم.
        </p>
        <div class="alert alert-secondary p-2 mb-3">
          <div class="small text-muted">الترقية آمنة: لن يتم لمس أي مستخدم ليس من نوع vouchers (يجب أن يحتوي التعليق على <code>voucher:</code>).</div>
        </div>

        <div class="d-flex align-items-center gap-2 ua-u-gap-10">
          <button id="btnUpgrade" class="btn btn-warning">ترقية الكروت القديمة الآن</button>
          <input id="upgradeLimit" type="number" class="form-control ua-u-maxw-140" value="300" min="10" max="2000">
          <span class="text-muted small">عدد الكروت في الدفعة الواحدة</span>
        </div>

        <div id="upgradeResult" class="mt-3 ua-u-hidden"></div>
      </div>
    </div>

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

<script>
(function(){
  // Generate random secret
  const gen = document.getElementById('genSecret');
  const sec = document.getElementById('acctSecret');
  if(gen && sec){
    gen.addEventListener('click', function(){
      const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
      let out='';
      for(let i=0;i<32;i++) out += chars[Math.floor(Math.random()*chars.length)];
      sec.value = out;
    });
  }

  // Install accounting push on MikroTik
  const btnInstall = document.getElementById('btnInstallAcct');
  if(btnInstall){
    btnInstall.addEventListener('click', async function(){
      if(!confirm('سيتم تثبيت/تحديث Script + Scheduler على MikroTik لإرسال Accounting. هل تريد المتابعة؟')) return;
      btnInstall.disabled = true;
      try{
        const fd = new FormData();
        fd.append('action','install_voucher_acct');
        fd.append('csrf_token','<?= h($csrf) ?>');
        const res = await fetch('vouchers_api.php', { method:'POST', body: fd, credentials:'same-origin' });
        const j = await res.json();
        if(!j.ok){
          alert('❌ ' + (j.error||'فشل')); 
        } else {
          alert('✅ تم التثبيت على MikroTik\nScript: '+(j.script||'')+'\nScheduler: '+(j.scheduler||'')+'\nInterval: '+(j.interval||''));
        }
      } catch(e){
        alert('❌ خطأ: '+e.message);
      } finally {
        btnInstall.disabled = false;
      }
    });
  }

  const btn = document.getElementById('btnUpgrade');
  const out = document.getElementById('upgradeResult');
  const lim = document.getElementById('upgradeLimit');
  if(!btn) return;

  function show(html, cls){
    out.style.display='block';
    out.className = 'alert ' + (cls || 'alert-info');
    out.innerHTML = html;
  }

  btn.addEventListener('click', async function(){
    if(!confirm('سيتم ترقية الكروت القديمة على MikroTik إلى نظام المدة من أول تسجيل دخول. هل تريد المتابعة؟')) return;
    btn.disabled = true;
    show('جارٍ الترقية...','alert-info');
    try{
      const fd = new FormData();
      fd.append('action','upgrade_legacy_wallclock');
      fd.append('csrf_token','<?= h($csrf) ?>');
      fd.append('limit', String(parseInt(lim.value||'300',10)));
      const res = await fetch('vouchers_api.php', { method:'POST', body: fd, credentials:'same-origin' });
      const j = await res.json();
      if(!j.ok){
        show('❌ ' + (j.error||'فشل غير معروف'), 'alert-danger');
      } else {
        const msg = j.message ? ('<div>'+j.message+'</div>') : '';
        show(
          msg +
          '<div>✅ تمت مراجعة: <b>'+(j.checked||0)+'</b></div>'+
          '<div>⬆️ تمت الترقية: <b>'+(j.upgraded||0)+'</b></div>'+
          '<div>⏭️ تم تجاوز: <b>'+(j.skipped||0)+'</b></div>'+
          '<div>❓ غير موجود على MikroTik: <b>'+(j.not_found||0)+'</b></div>'+
          '<div class="small text-muted mt-2">إن كان لديك المزيد، اضغط مرة أخرى لتطبيق دفعة جديدة.</div>',
          'alert-success'
        );
      }
    } catch(e){
      show('❌ خطأ أثناء الاتصال: ' + e.message, 'alert-danger');
    } finally {
      btn.disabled = false;
    }
  });
})();
</script>
<?php require_once __DIR__ . '/footer.php'; ?>
