<?php
declare(strict_types=1);

$page_title = 'إرسال رسالة للمشتركين المحددين';
$UA_FORCE_DESIGN_V2 = true;
$UA_PAGE_CSS = ['assets/css/subscriber_messages_bulk.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__ . '/messages_lib.php';

require_login('index.php?login=1');
if (function_exists('require_perm')) {
  require_perm('can_view_subscribers');
  require_perm('can_manage_messages');
}
$conn = ensure_db(true);
ensure_message_queue_tables($conn);

function smb_parse_ids($raw): array {
  if (is_array($raw)) $raw = implode(',', $raw);
  $ids = [];
  foreach (preg_split('/[^0-9]+/', (string)$raw, -1, PREG_SPLIT_NO_EMPTY) as $value) {
    $id = (int)$value;
    if ($id > 0) $ids[$id] = $id;
    if (count($ids) >= 1000) break;
  }
  return array_values($ids);
}

$ids = smb_parse_ids($_REQUEST['ids'] ?? '');
$error = '';
$selectedRows = [];
if ($ids) {
  $idSql = implode(',', array_map('intval', $ids));
  $deletedWhere = ml_col_exists($conn, 'subscribers', 'is_deleted') ? ' AND COALESCE(is_deleted,0)=0' : '';
  $selectedResult = @$conn->query("SELECT * FROM subscribers WHERE id IN ({$idSql}){$deletedWhere} ORDER BY FIELD(id,{$idSql})");
  if ($selectedResult) while ($row = $selectedResult->fetch_assoc()) $selectedRows[] = $row;
}
if (!$selectedRows) $error = 'حدد مشتركاً واحداً على الأقل من صفحة عرض المشتركين.';

$templates = get_message_templates($conn);
$posted = [
  'title'=>trim((string)($_POST['title'] ?? ('رسالة محددة - ' . date('Y-m-d H:i')))),
  'template_key'=>trim((string)($_POST['template_key'] ?? '')),
  'channel'=>strtolower(trim((string)($_POST['channel'] ?? 'whatsapp'))),
  'audience'=>strtolower(trim((string)($_POST['audience'] ?? 'all'))),
  'exclude'=>$_POST['exclude'] ?? [],
];
if (!is_array($posted['exclude'])) $posted['exclude'] = [$posted['exclude']];

if ($_SERVER['REQUEST_METHOD'] === 'POST' && $error === '') {
  $filters = messages_campaign_normalize_filters([
    'audience'=>$posted['audience'],
    'exclude'=>$posted['exclude'],
    'subscriber_ids'=>array_column($selectedRows, 'id'),
  ]);
  if (function_exists('ua_csrf_verify') && !ua_csrf_verify()) {
    $error = 'انتهت صلاحية الطلب. أعد تحميل الصفحة وحاول مجدداً.';
  } elseif (messages_queue_active_run($conn, false)) {
    $error = 'توجد دورة إرسال قيد التنفيذ أو بانتظار الموافقة. أكملها من صندوق الرسائل أولاً.';
  } elseif ($posted['title'] === '' || $posted['template_key'] === '') {
    $error = 'أدخل عنوان العملية واختر قالب الرسالة.';
  } elseif (!in_array($posted['channel'], ['sms','whatsapp','both'], true)) {
    $error = 'قناة الإرسال غير صالحة.';
  } elseif (!in_array($posted['audience'], ['all','active','stopped','has_phone'], true)) {
    $error = 'شرط الجمهور غير صالح.';
  } elseif (in_array('unpaid_invoices', $filters['exclude'], true)
      && in_array('no_unpaid_invoices', $filters['exclude'], true)) {
    $error = 'لا يمكن استثناء ذوي المستحقات والمسدّدين بالكامل معاً.';
  } elseif (in_array('complete_profile', $filters['exclude'], true)
      && in_array('incomplete_profile', $filters['exclude'], true)) {
    $error = 'لا يمكن استثناء مكتملة المعلومات وناقصة المعلومات معاً.';
  } elseif (!messages_load_template($conn, $posted['template_key'])) {
    $error = 'قالب الرسالة غير موجود أو غير مفعّل.';
  }

  if ($error === '') {
    $filtersJson = json_encode($filters, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    if (!is_string($filtersJson)) $filtersJson = '{}';
    $actorId = (int)($_SESSION['admin_user_id'] ?? $_SESSION['admin_id'] ?? 0);
    $actorParam = $actorId > 0 ? $actorId : null;
    $insert = $conn->prepare("INSERT INTO message_campaigns
      (title,template_key,channel,filters_json,status,created_by)
      VALUES (?,?,?,?,'DRAFT',?)");
    if (!$insert) {
      $error = 'تعذر تجهيز عملية الإرسال.';
    } else {
      $insert->bind_param('ssssi', $posted['title'], $posted['template_key'], $posted['channel'], $filtersJson, $actorParam);
      if (!$insert->execute()) $error = 'تعذر حفظ عملية الإرسال.';
      $campaignId = (int)$conn->insert_id;
      $insert->close();
    }

    if ($error === '' && $campaignId > 0) {
      $queued = messages_campaign_enqueue_targets(
        $conn,
        $campaignId,
        $posted['template_key'],
        $posted['channel'],
        $filters,
        $actorId
      );
      if (empty($queued['ok'])) {
        $error = (string)($queued['error'] ?? 'تعذر إضافة الرسائل إلى صندوق الإرسال.');
      } elseif ((int)($queued['queued'] ?? 0) <= 0) {
        $error = 'لا يوجد ضمن المحددين مشترك يطابق الشروط ولديه رقم هاتف صالح.';
      } else {
        $totalTargets = (int)($queued['total_targets'] ?? 0);
        $queuedCount = (int)($queued['queued'] ?? 0);
        $update = $conn->prepare("UPDATE message_campaigns SET total_targets=?,queued_count=?,status='QUEUED' WHERE id=? LIMIT 1");
        if ($update) {
          $update->bind_param('iii', $totalTargets, $queuedCount, $campaignId);
          $update->execute();
          $update->close();
        }
        $runResult = messages_queue_create_run($conn, $actorId, null, $campaignId);
        if (!empty($runResult['run'])) {
          header('Location: messages_outbox.php?bulk_campaign=' . $campaignId);
          exit;
        }
        $error = (string)($runResult['error'] ?? 'تعذر بدء اختبار الإرسال. الرسائل محفوظة في صندوق الإرسال.');
      }
      if ($error !== '') {
        @$conn->query("DELETE FROM message_campaigns WHERE id={$campaignId} AND NOT EXISTS (SELECT 1 FROM message_outbox WHERE campaign_id={$campaignId})");
      }
    }
  }
}

require_once __DIR__ . '/header.php';
require_once __DIR__ . '/sidebar.php';
?>
<div class="content-wrapper"><section class="content"><div class="smb-shell">
  <header class="smb-head">
    <div><h1>إرسال رسالة للمحددين</h1><p>لن تدخل في العملية أي أرقام خارج المشتركين الذين حددتهم.</p></div>
    <a href="subscribers.php"><i class="fa fa-arrow-right"></i><span>العودة للمشتركين</span></a>
  </header>

  <?php if ($error !== ''): ?><div class="smb-alert"><i class="fa fa-exclamation-triangle"></i> <?= h($error) ?></div><?php endif; ?>

  <?php if ($selectedRows): ?>
  <section class="smb-card smb-card--settings">
    <div class="smb-title"><h2>إعداد الرسالة وشروطها</h2><b><i class="fa fa-envelope"></i></b></div>
    <form method="post" class="smb-form">
      <?php if (function_exists('ua_csrf_field')) ua_csrf_field(); ?>
      <input type="hidden" name="ids" value="<?= h(implode(',', array_column($selectedRows, 'id'))) ?>">
      <label class="smb-wide"><span>عنوان العملية</span><input name="title" value="<?= h($posted['title']) ?>" required></label>
      <label><span>قالب الرسالة</span><select name="template_key" required><option value="">— اختر القالب —</option><?php foreach ($templates as $key => $template): ?><option value="<?= h((string)$key) ?>" <?= $posted['template_key']===(string)$key?'selected':'' ?>><?= h((string)$key . ' — ' . (string)($template['title'] ?? '')) ?></option><?php endforeach; ?></select></label>
      <label><span>قناة الإرسال</span><select name="channel"><option value="whatsapp" <?= $posted['channel']==='whatsapp'?'selected':'' ?>>WhatsApp</option><option value="sms" <?= $posted['channel']==='sms'?'selected':'' ?>>SMS</option><option value="both" <?= $posted['channel']==='both'?'selected':'' ?>>WhatsApp + SMS</option></select></label>
      <label><span>شرط الجمهور ضمن المحددين</span><select name="audience"><option value="all" <?= $posted['audience']==='all'?'selected':'' ?>>كل المحددين</option><option value="active" <?= $posted['audience']==='active'?'selected':'' ?>>النشطون فقط</option><option value="stopped" <?= $posted['audience']==='stopped'?'selected':'' ?>>المتوقفون فقط</option><option value="has_phone" <?= $posted['audience']==='has_phone'?'selected':'' ?>>من لديهم رقم فقط</option></select></label>
      <label><span>استبعاد حسب الحساب</span><select name="exclude[]"><option value="">دون استبعاد</option><option value="unpaid_invoices" <?= in_array('unpaid_invoices',$posted['exclude'],true)?'selected':'' ?>>ذوو المستحقات القائمة</option><option value="no_unpaid_invoices" <?= in_array('no_unpaid_invoices',$posted['exclude'],true)?'selected':'' ?>>المسدّدون بالكامل</option></select></label>
      <label><span>استبعاد حسب اكتمال البيانات</span><select name="exclude[]"><option value="">دون استبعاد</option><option value="complete_profile" <?= in_array('complete_profile',$posted['exclude'],true)?'selected':'' ?>>مكتملة المعلومات</option><option value="incomplete_profile" <?= in_array('incomplete_profile',$posted['exclude'],true)?'selected':'' ?>>ناقصة المعلومات</option></select></label>
      <div class="smb-actions"><p><i class="fa fa-mobile"></i> سيبدأ الإرسال إلى رقم الاختبار المحفوظ، ثم ينتظر موافقتك من صندوق الرسائل.</p><button type="submit"><i class="fa fa-paper-plane"></i> إرسال الاختبار والمتابعة</button></div>
    </form>
  </section>
  <?php endif; ?>

  <section class="smb-card smb-card--selected">
    <div class="smb-title"><h2>المشتركون المحددون</h2><b><?= count($selectedRows) ?></b></div>
    <?php if ($selectedRows): ?><div class="smb-selected">
      <?php foreach ($selectedRows as $subscriber): ?>
        <span class="smb-person"><i class="fa fa-user"></i><b><?= h((string)($subscriber['full_name'] ?? $subscriber['username'] ?? ('#' . $subscriber['id']))) ?></b><small dir="ltr"><?= h((string)($subscriber['phone'] ?? '—')) ?></small></span>
      <?php endforeach; ?>
    </div><?php else: ?><div class="smb-empty">لا توجد أرقام محددة.</div><?php endif; ?>
  </section>
</div></section></div>
<?php require_once __DIR__ . '/footer.php'; ?>
