<?php
$page_title = 'إعدادات إرسال SMS';
$UA_FORCE_DESIGN_V2 = true;
$uaAndroidSettingsSms = ((string)($_GET['ua_android'] ?? '') === '1')
  || stripos((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 'NetworkCustomersAndroid/') !== false;
$UA_PAGE_CSS = [$uaAndroidSettingsSms ? 'assets/css/android_settings_sms.css' : 'assets/css/settings_sms.css'];

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

require_login();
if (function_exists('require_perm')) require_perm('can_settings');
$conn = ensure_db(true);

$msg = '';
$err = '';
$testResult = null;
$localCheck = null;
$savedRaw = setting_get($conn, 'sms_provider', []);
$cfg = sms_provider_normalize_config($savedRaw);

function sms_settings_config_from_post(array $base): array
{
  $posted = $base;
  $posted['enabled'] = isset($_POST['enabled']) ? '1' : '0';
  $posted['mode'] = (string)($_POST['mode'] ?? $base['mode']);
  $posted['sender_id'] = (string)($_POST['sender_id'] ?? '');
  $posted['default_country_code'] = (string)($_POST['default_country_code'] ?? '963');
  $posted['api_international_numbers'] = isset($_POST['api_international_numbers']) ? '1' : '0';
  $posted['api_url'] = (string)($_POST['api_url'] ?? '');
  $posted['method'] = (string)($_POST['method'] ?? 'POST');
  $posted['body_type'] = (string)($_POST['body_type'] ?? 'json');
  $posted['auth_type'] = (string)($_POST['auth_type'] ?? 'bearer');
  $posted['token'] = (string)($_POST['token'] ?? '');
  $posted['username'] = (string)($_POST['username'] ?? '');
  $posted['password'] = (string)($_POST['password'] ?? '');
  $posted['api_key_name'] = (string)($_POST['api_key_name'] ?? 'api_key');
  $posted['api_key_value'] = (string)($_POST['api_key_value'] ?? '');
  $posted['param_map'] = [
    'to' => (string)($_POST['p_to'] ?? 'to'),
    'text' => (string)($_POST['p_text'] ?? 'text'),
    'sender' => (string)($_POST['p_sender'] ?? 'sender'),
  ];
  $posted['extra_params'] = (string)($_POST['extra_params'] ?? '');
  $posted['timeout'] = (int)($_POST['timeout'] ?? 20);
  $posted['local_port'] = (string)($_POST['local_port'] ?? 'COM5');
  $posted['local_connection'] = (string)($_POST['local_connection'] ?? 'at');
  $posted['local_timeout'] = (int)($_POST['local_timeout'] ?? 90);
  $posted['local_autolen'] = (int)($_POST['local_autolen'] ?? 120);
  $posted['test_phone'] = (string)($_POST['test_phone'] ?? '');
  $posted['queue_confirmation_required'] = isset($_POST['queue_confirmation_required']) ? '1' : '0';
  return sms_provider_normalize_config($posted);
}

if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {
  if (function_exists('ua_csrf_verify') && !ua_csrf_verify()) {
    $err = 'انتهت صلاحية الطلب. أعد تحميل الصفحة وحاول مجدداً.';
  } else {
    $cfg = sms_settings_config_from_post($cfg);
    $action = (string)($_POST['action'] ?? '');

    if ($action === 'save') {
      if ($cfg['enabled'] === '1' && preg_replace('/\D+/', '', (string)$cfg['test_phone']) === '') {
        $err = 'أدخل رقم اختبار صالحاً ليكون أول رقم في دورة الإرسال.';
      }
      if ($cfg['mode'] === 'api' && $cfg['enabled'] === '1') {
        if (!filter_var($cfg['api_url'], FILTER_VALIDATE_URL) || !preg_match('#^https?://#i', $cfg['api_url'])) {
          $err = 'أدخل رابط API صالحاً يبدأ بـ http:// أو https://.';
        }
        if ($err === '' && trim((string)$cfg['extra_params']) !== '') {
          $extra = json_decode((string)$cfg['extra_params'], true);
          if (!is_array($extra)) $err = 'الخيارات الإضافية في API يجب أن تكون JSON صالحاً.';
        }
      }
      if ($err === '' && $cfg['mode'] === 'local') {
        $prepared = sms_provider_write_managed_config($cfg);
        if (empty($prepared['ok'])) $err = (string)($prepared['error'] ?? 'تعذر تجهيز إعداد Gammu.');
        else $cfg['local_config_path'] = (string)$prepared['path'];
      }
      if ($err === '') {
        if (setting_set($conn, 'sms_provider', $cfg)) $msg = 'تم حفظ إعدادات SMS بنجاح.';
        else $err = 'تعذر حفظ الإعدادات في قاعدة البيانات.';
      }
    } elseif ($action === 'check_local') {
      $sender = new SmsProviderSender($conn, $cfg);
      $localCheck = $sender->localHealth();
      if (!empty($localCheck['ok'])) $msg = (string)$localCheck['message'];
      else $err = (string)($localCheck['error'] ?? 'تعذر الاتصال بمودم USB.');
    } elseif ($action === 'test_sms') {
      $to = (string)($_POST['test_to'] ?? $cfg['test_phone']);
      $text = trim((string)($_POST['test_text'] ?? ''));
      if (preg_replace('/\D+/', '', $to) === '' || $text === '') {
        $err = 'أدخل رقم اختبار ونص الرسالة.';
      } else {
        $sender = new SmsProviderSender($conn, $cfg);
        $testResult = $sender->sendText($to, $text, ['source'=>'settings_test']);
        if (!empty($testResult['ok'])) $msg = 'تم إرسال رسالة الاختبار بنجاح.';
        else $err = (string)($testResult['error'] ?? 'فشل إرسال رسالة الاختبار.');
      }
    }
  }
}

$binaryReady = is_file((string)$cfg['local_gammu_path']);
$configReady = preg_match('/^COM[0-9]{1,3}$/', strtoupper((string)$cfg['local_port'])) === 1;
require_once __DIR__ . '/header.php';
if (!defined('UA_EMBED') || !UA_EMBED) require_once __DIR__ . '/sidebar.php';
$active_tab = 'provider';
if ($uaAndroidSettingsSms) {
  require __DIR__ . '/android_settings_sms.php';
  require_once __DIR__ . '/footer.php';
  return;
}
include __DIR__ . '/messages_tabs.php';
?>

<div class="content-wrapper ua-sms-settings-page">
  <section class="content-header">
    <div class="container-fluid">
      <div class="sms-settings-heading">
        <div>
          <span>SMS DELIVERY</span>
          <h1>إعدادات إرسال الرسائل النصية</h1>
          <p>اختر مساراً واحداً للإرسال: مودم USB محلي أو مزوّد SMS عبر API.</p>
        </div>
        <a href="messages_outbox.php"><i class="fa fa-paper-plane"></i><span>صندوق الإرسال</span></a>
      </div>
    </div>
  </section>

  <section class="content">
    <div class="container-fluid">
      <?php if ($msg !== ''): ?><div class="sms-notice is-success" role="status"><i class="fa fa-check-circle"></i><span><?= h($msg) ?></span></div><?php endif; ?>
      <?php if ($err !== ''): ?><div class="sms-notice is-error" role="alert"><i class="fa fa-exclamation-triangle"></i><span><?= h($err) ?></span></div><?php endif; ?>

      <form method="post" class="sms-settings-form" id="smsSettingsForm">
        <?php if (function_exists('ua_csrf_field')) ua_csrf_field(); ?>

        <section class="sms-settings-card sms-provider-card">
          <div class="sms-card-title">
            <i class="fa fa-random"></i>
            <div><span>طريقة الإرسال</span><h2>اختر مزوّد SMS الفعلي</h2></div>
          </div>

          <label class="sms-master-switch">
            <input type="checkbox" name="enabled" value="1" <?= $cfg['enabled'] === '1' ? 'checked' : '' ?>>
            <span><b>تفعيل إرسال SMS</b><small>عند تعطيله تبقى الرسائل في الطابور ولا تُرسل.</small></span>
          </label>

          <div class="sms-provider-options">
            <label class="sms-provider-option">
              <input type="radio" name="mode" value="local" <?= $cfg['mode'] === 'local' ? 'checked' : '' ?>>
              <span class="sms-provider-option__icon"><i class="fa fa-usb"></i></span>
              <span><b>إرسال محلي عبر USB</b><small>مودم GSM موصول بالجهاز ويعمل بواسطة Gammu.</small></span>
              <em>LOCAL</em>
            </label>
            <label class="sms-provider-option">
              <input type="radio" name="mode" value="api" <?= $cfg['mode'] === 'api' ? 'checked' : '' ?>>
              <span class="sms-provider-option__icon"><i class="fa fa-cloud"></i></span>
              <span><b>إرسال عبر SMS API</b><small>اتصال HTTP مع شركة الرسائل باستخدام بيانات الاعتماد.</small></span>
              <em>API</em>
            </label>
          </div>
        </section>

        <section class="sms-settings-card" data-mode-panel="local">
          <div class="sms-card-title">
            <i class="fa fa-usb"></i>
            <div><span>GAMMU / USB MODEM</span><h2>إعداد الإرسال المحلي</h2></div>
            <div class="sms-readiness">
              <span class="<?= $binaryReady ? 'is-ready' : 'is-missing' ?>"><i></i> Gammu مدمج</span>
              <span class="<?= $configReady ? 'is-ready' : 'is-missing' ?>"><i></i> إعداد تلقائي</span>
            </div>
          </div>

          <div class="sms-grid sms-grid--wide">
            <label class="sms-field">
              <span>منفذ المودم</span>
              <input id="smsLocalPort" name="local_port" value="<?= h((string)$cfg['local_port']) ?>" dir="ltr" placeholder="COM5" list="smsDetectedPorts" autocomplete="off">
              <datalist id="smsDetectedPorts"></datalist>
              <small>يُكتشف مودم الرسائل تلقائياً، ويمكنك كتابة COM يدوياً في أي وقت.</small>
            </label>
            <label class="sms-field">
              <span>نوع الاتصال</span>
              <select name="local_connection">
                <?php foreach (['at'=>'AT تلقائي','at115200'=>'AT بسرعة 115200','at19200'=>'AT بسرعة 19200'] as $value=>$label): ?>
                  <option value="<?= h($value) ?>" <?= $cfg['local_connection'] === $value ? 'selected' : '' ?>><?= h($label) ?></option>
                <?php endforeach; ?>
              </select>
            </label>
            <label class="sms-field">
              <span>مهلة الإرسال</span>
              <input type="number" name="local_timeout" min="15" max="180" value="<?= (int)$cfg['local_timeout'] ?>">
              <small>بالثواني لكل رسالة.</small>
            </label>
            <label class="sms-field">
              <span>أقصى عدد أجزاء للرسالة</span>
              <input type="number" name="local_autolen" min="1" max="255" value="<?= (int)$cfg['local_autolen'] ?>">
            </label>
          </div>

          <div class="sms-modem-detection">
            <button class="sms-secondary-action" type="button" id="smsDetectModem">
              <i class="fa fa-search"></i><span>إعادة اكتشاف منفذ المودم تلقائياً</span>
            </button>
            <p id="smsModemDetectionStatus" role="status" aria-live="polite">سيبدأ اكتشاف منافذ COM تلقائياً.</p>
          </div>

          <button class="sms-secondary-action" type="submit" name="action" value="check_local">
            <i class="fa fa-plug"></i><span>فحص اتصال مودم USB دون إرسال</span>
          </button>

          <?php if (is_array($localCheck) && !empty($localCheck['details'])): ?>
            <dl class="sms-device-details">
              <?php foreach ($localCheck['details'] as $key=>$value): ?><div><dt><?= h((string)$key) ?></dt><dd dir="ltr"><?= h((string)$value) ?></dd></div><?php endforeach; ?>
            </dl>
          <?php endif; ?>
        </section>

        <section class="sms-settings-card" data-mode-panel="api">
          <div class="sms-card-title">
            <i class="fa fa-cloud"></i>
            <div><span>HTTP SMS PROVIDER</span><h2>إعداد مزوّد API</h2></div>
          </div>

          <div class="sms-grid">
            <label class="sms-field is-wide">
              <span>رابط الإرسال API URL</span>
              <input name="api_url" value="<?= h((string)$cfg['api_url']) ?>" dir="ltr" placeholder="https://provider.example.com/send" autocomplete="off">
            </label>
            <label class="sms-field">
              <span>طريقة الطلب</span>
              <select name="method">
                <option value="POST" <?= $cfg['method'] === 'POST' ? 'selected' : '' ?>>POST</option>
                <option value="GET" <?= $cfg['method'] === 'GET' ? 'selected' : '' ?>>GET</option>
              </select>
            </label>
            <label class="sms-field">
              <span>صيغة البيانات</span>
              <select name="body_type">
                <option value="json" <?= $cfg['body_type'] === 'json' ? 'selected' : '' ?>>JSON</option>
                <option value="form" <?= $cfg['body_type'] === 'form' ? 'selected' : '' ?>>Form URL Encoded</option>
              </select>
            </label>
            <label class="sms-field">
              <span>طريقة المصادقة</span>
              <select name="auth_type" id="smsAuthType">
                <option value="bearer" <?= $cfg['auth_type'] === 'bearer' ? 'selected' : '' ?>>Bearer Token</option>
                <option value="basic" <?= $cfg['auth_type'] === 'basic' ? 'selected' : '' ?>>Basic Authentication</option>
                <option value="param" <?= $cfg['auth_type'] === 'param' ? 'selected' : '' ?>>API Key Parameter</option>
                <option value="none" <?= $cfg['auth_type'] === 'none' ? 'selected' : '' ?>>بدون مصادقة</option>
              </select>
            </label>
            <label class="sms-field">
              <span>مهلة API</span>
              <input type="number" name="timeout" min="5" max="60" value="<?= (int)$cfg['timeout'] ?>">
            </label>
            <label class="sms-field" data-auth-panel="bearer">
              <span>Bearer Token</span>
              <input type="password" name="token" value="<?= h((string)$cfg['token']) ?>" dir="ltr" autocomplete="new-password">
            </label>
            <label class="sms-field" data-auth-panel="basic">
              <span>اسم المستخدم</span>
              <input name="username" value="<?= h((string)$cfg['username']) ?>" dir="ltr" autocomplete="off">
            </label>
            <label class="sms-field" data-auth-panel="basic">
              <span>كلمة المرور</span>
              <input type="password" name="password" value="<?= h((string)$cfg['password']) ?>" dir="ltr" autocomplete="new-password">
            </label>
            <label class="sms-field" data-auth-panel="param">
              <span>اسم API Key</span>
              <input name="api_key_name" value="<?= h((string)$cfg['api_key_name']) ?>" dir="ltr">
            </label>
            <label class="sms-field" data-auth-panel="param">
              <span>قيمة API Key</span>
              <input type="password" name="api_key_value" value="<?= h((string)$cfg['api_key_value']) ?>" dir="ltr" autocomplete="new-password">
            </label>
          </div>

          <details class="sms-advanced">
            <summary><span><i class="fa fa-sliders"></i> أسماء الحقول والخيارات المتقدمة</span><i class="fa fa-angle-down"></i></summary>
            <div class="sms-grid">
              <label class="sms-field"><span>حقل رقم الهاتف</span><input name="p_to" value="<?= h((string)$cfg['param_map']['to']) ?>" dir="ltr"></label>
              <label class="sms-field"><span>حقل نص الرسالة</span><input name="p_text" value="<?= h((string)$cfg['param_map']['text']) ?>" dir="ltr"></label>
              <label class="sms-field"><span>حقل اسم المرسل</span><input name="p_sender" value="<?= h((string)$cfg['param_map']['sender']) ?>" dir="ltr"></label>
              <label class="sms-field"><span>اسم المرسل Sender ID</span><input name="sender_id" value="<?= h((string)$cfg['sender_id']) ?>" dir="ltr"></label>
              <label class="sms-field"><span>كود الدولة الافتراضي</span><input name="default_country_code" value="<?= h((string)$cfg['default_country_code']) ?>" dir="ltr" placeholder="963"></label>
              <label class="sms-check-field">
                <input type="checkbox" name="api_international_numbers" value="1" <?= $cfg['api_international_numbers'] === '1' ? 'checked' : '' ?>>
                <span><b>تحويل أرقام API إلى دولية</b><small>مثال: 09… يصبح 9639…، ولا يطبّق على مودم USB.</small></span>
              </label>
              <label class="sms-field is-wide"><span>خيارات إضافية JSON</span><textarea name="extra_params" dir="ltr" placeholder='{"route":"transactional","unicode":1}'><?= h((string)$cfg['extra_params']) ?></textarea></label>
            </div>
          </details>
        </section>

        <section class="sms-settings-card sms-test-card">
          <div class="sms-card-title">
            <i class="fa fa-paper-plane"></i>
            <div><span>DELIVERY TEST</span><h2>اختبار الإرسال الفعلي</h2></div>
          </div>
          <div class="sms-grid">
            <label class="sms-field">
              <span>رقم الاختبار</span>
              <input name="test_to" value="<?= h((string)($_POST['test_to'] ?? $cfg['test_phone'])) ?>" dir="ltr" placeholder="09XXXXXXXX أو 9639XXXXXXXX">
            </label>
            <label class="sms-field">
              <span>نص الرسالة</span>
              <input name="test_text" value="<?= h((string)($_POST['test_text'] ?? '')) ?>" placeholder="رسالة اختبار من النظام">
            </label>
          </div>
          <button class="sms-test-action" type="submit" name="action" value="test_sms" onclick="return confirm('سيتم إرسال SMS إلى الرقم المدخل. هل تريد المتابعة؟');">
            <i class="fa fa-paper-plane"></i><span>إرسال رسالة اختبار</span>
          </button>
          <?php if (is_array($testResult)): ?>
            <pre class="sms-test-result" dir="ltr"><?= h(json_encode($testResult, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)) ?></pre>
          <?php endif; ?>
        </section>

        <section class="sms-settings-card sms-queue-safety-card">
          <div class="sms-card-title">
            <i class="fa fa-check-square-o"></i>
            <div><span>QUEUE CONTROL</span><h2>اختبار الطابور والموافقة</h2></div>
          </div>
          <div class="sms-grid">
            <label class="sms-field">
              <span>رقم الاختبار المحفوظ</span>
              <input name="test_phone" value="<?= h((string)$cfg['test_phone']) ?>" dir="ltr" inputmode="tel" placeholder="09XXXXXXXX أو 9639XXXXXXXX">
              <small>تُرسل إليه نسخة الرسالة أولاً قبل رسائل المشتركين.</small>
            </label>
            <label class="sms-check-field">
              <input type="checkbox" name="queue_confirmation_required" value="1" <?= $cfg['queue_confirmation_required'] === '1' ? 'checked' : '' ?>>
              <span><b>طلب تأكيد متابعة الطابور</b><small>بعد نجاح رسالة الاختبار ينتظر الطابور موافقتك قبل إرسال أي رسالة للمشتركين.</small></span>
            </label>
          </div>
        </section>

        <div class="sms-save-bar">
          <div><i class="fa fa-shield"></i><span>لن يُعتبر أي إرسال ناجحاً إلا بعد تأكيد Gammu أو استجابة API ناجحة.</span></div>
          <button type="submit" name="action" value="save"><i class="fa fa-save"></i><span>حفظ إعدادات SMS</span></button>
        </div>
      </form>
    </div>
  </section>
</div>

<script>
(function(){
  const notices = [...document.querySelectorAll('.sms-notice')];
  if (notices.length) {
    const toastStack = document.createElement('div');
    toastStack.className = 'ua-feedback-stack sms-toast-stack';
    toastStack.setAttribute('aria-live', 'polite');
    notices.forEach(notice => {
      const close = document.createElement('button');
      close.type = 'button';
      close.className = 'sms-notice__close';
      close.setAttribute('aria-label', 'إغلاق الرسالة');
      close.innerHTML = '<i class="fa fa-times"></i>';
      close.addEventListener('click', () => notice.remove());
      notice.appendChild(close);
      toastStack.appendChild(notice);
    });
    document.body.appendChild(toastStack);
  }

  const form = document.getElementById('smsSettingsForm');
  if (!form) return;
  const modeInputs = [...form.querySelectorAll('input[name="mode"]')];
  const modePanels = [...form.querySelectorAll('[data-mode-panel]')];
  const auth = form.querySelector('#smsAuthType');
  const authPanels = [...form.querySelectorAll('[data-auth-panel]')];
  const modemPort = form.querySelector('#smsLocalPort');
  const modemPorts = form.querySelector('#smsDetectedPorts');
  const detectModemButton = form.querySelector('#smsDetectModem');
  const detectModemStatus = form.querySelector('#smsModemDetectionStatus');
  let modemDetectionRunning = false;

  function syncMode(){
    const selected = modeInputs.find(input => input.checked)?.value || 'local';
    modePanels.forEach(panel => { panel.hidden = panel.dataset.modePanel !== selected; });
    form.dataset.mode = selected;
  }
  function syncAuth(){
    const selected = auth?.value || 'none';
    authPanels.forEach(panel => { panel.hidden = panel.dataset.authPanel !== selected; });
  }
  async function detectModem(){
    if (!modemPort || modemDetectionRunning) return;
    modemDetectionRunning = true;
    if (detectModemButton) detectModemButton.disabled = true;
    if (detectModemStatus) detectModemStatus.textContent = 'جارٍ قراءة منافذ ويندوز والتحقق من مودم GSM…';
    try {
      const response = await fetch('api/sms_modem_detect.php', {
        headers: {'Accept':'application/json','X-Requested-With':'XMLHttpRequest'},
        cache: 'no-store'
      });
      const data = await response.json();
      const ports = Array.isArray(data.ports) ? data.ports : [];
      if (modemPorts) {
        modemPorts.replaceChildren(...ports.map(device => {
          const option = document.createElement('option');
          option.value = String(device.port || '');
          option.label = String(device.name || device.port || '');
          return option;
        }));
      }
      if (data.verified && data.port) {
        modemPort.value = String(data.port).toUpperCase();
        const connection = form.querySelector('select[name="local_connection"]');
        if (connection && data.connection) connection.value = data.connection;
      }
      if (detectModemStatus) detectModemStatus.textContent = data.message || 'انتهى فحص منافذ COM.';
    } catch (error) {
      if (detectModemStatus) detectModemStatus.textContent = 'تعذر الاكتشاف التلقائي. يبقى الإدخال اليدوي متاحاً.';
    } finally {
      modemDetectionRunning = false;
      if (detectModemButton) detectModemButton.disabled = false;
    }
  }
  modeInputs.forEach(input => input.addEventListener('change', syncMode));
  auth?.addEventListener('change', syncAuth);
  detectModemButton?.addEventListener('click', detectModem);
  syncMode();
  syncAuth();
  detectModem();
})();
</script>

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