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

$page_title = 'تعديل مشترك';

require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/helpers.php';
require_once __DIR__ . '/settings_store.php';
require_once __DIR__ . '/subscribers_lib.php';
require_once __DIR__ . '/subscriber_plan_schema.php';
require_once __DIR__ . '/subscriber_edit_save_lib.php';
require_once __DIR__ . '/subscriber_reference_data_lib.php';
require_once __DIR__ . '/subscriber_upload_lib.php';
require_once __DIR__ . '/super_admin_guard.php';
require_once __DIR__ . '/agent_schema.php';
require_once __DIR__ . '/agent_portal_lib.php';
require_once __DIR__ . '/agent_edit_request_lib.php';
require_once __DIR__ . '/subscriber_contracts_lib.php';
require_once __DIR__ . '/output_devices_lib.php';
require_once __DIR__ . '/subscriber_id_sequence_lib.php';

$id = (int)($_GET['id'] ?? 0);
$uaAgentEditToken = strtolower(trim((string)($_GET['agent_edit_token'] ?? $_POST['agent_edit_token'] ?? '')));
$uaAgentEditId = (int)($_GET['agent'] ?? $_POST['agent'] ?? 0);
$uaAgentEditContext = null;
if ($uaAgentEditToken !== '' && $uaAgentEditId > 0 && $id > 0) {
  if (!isset($conn) || !($conn instanceof mysqli)) $conn = ensure_db(true);
  $uaAgentPortalContext = agent_portal_boot($conn);
  if (!empty($uaAgentPortalContext['logged'])
      && (int)$uaAgentPortalContext['agent_id'] === $uaAgentEditId
      && ua_agent_edit_request_is_granted($conn, $uaAgentEditToken, $uaAgentEditId, $id)) {
    $uaAgentEditContext = $uaAgentPortalContext;
  }
}

if (!$uaAgentEditContext) {
  require_login();
  if(function_exists('require_perm')) require_perm('can_edit_subscriber');
}

$super_go = $id > 0 ? ('subscribers_edit.php?id=' . $id) : current_relative_url();
$super_edit_gate_key = 'super_admin_edit_form_ok_' . md5($super_go);

// مهم: صفحة التعديل تحتوي GET لفتح الصفحة ثم POST للحفظ.
// التأكيد السابق كان يُستهلك عند فتح الصفحة، وبعد الضغط على الحفظ
// يعاد طلب التأكيد/أحياناً تنتهي الجلسة قبل تنفيذ التعديل.
// لذلك نسمح بنفس التأكيد لطلب POST الحالي فقط لهذه الصفحة.
if (!$uaAgentEditContext && $_SERVER['REQUEST_METHOD'] !== 'POST') {
  require_super_admin_confirmation('تعديل بيانات مشترك', $super_go);
  $_SESSION[$super_edit_gate_key] = 1;
} elseif (!$uaAgentEditContext && empty($_SESSION[$super_edit_gate_key])) {
  require_super_admin_confirmation('تعديل بيانات مشترك', $super_go);
}

$UA_FORCE_DESIGN_V2 = true;
$uaAndroidEdit = ((string)($_GET['ua_android'] ?? '') === '1')
  || stripos((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 'NetworkCustomersAndroid/') !== false;
$UA_PAGE_CSS = $uaAndroidEdit
  ? ['assets/css/ua_subscribers_edit_adapter.css', 'assets/css/android_subscriber_edit.css', 'assets/css/subscriber_info_print_actions.css']
  : ['assets/css/ua_subscribers_edit_adapter.css', 'assets/css/subscriber_info_print_actions.css'];
if ($uaAgentEditContext) {
  $GLOBALS['UA_AGENT_EDIT_CONTEXT'] = true;
  $GLOBALS['UA_POPUP'] = true;
}
include __DIR__ . '/header.php';
if (!$uaAgentEditContext) include __DIR__ . '/sidebar.php';

// Stage 13: shared schema preparation for add/edit pages.
if (function_exists('subscriber_plan_ensure_schema')) { @subscriber_plan_ensure_schema($conn); }
if (function_exists('subs_ensure_pppoe_cols')) { @subs_ensure_pppoe_cols($conn); }
if (function_exists('ua_agent_schema_migrate')) { @ua_agent_schema_migrate($conn); }

function se_fetch_speeds(mysqli $conn): array {
  return function_exists('subscriber_ref_fetch_speeds') ? subscriber_ref_fetch_speeds($conn) : [];
}

function se_fetch_packages(mysqli $conn): array {
  return function_exists('subscriber_ref_fetch_packages') ? subscriber_ref_fetch_packages($conn) : [];
}

function se_fetch_sectors(mysqli $conn): array {
  return function_exists('subscriber_ref_fetch_sectors') ? subscriber_ref_fetch_sectors($conn, true) : [];
}
$SE_NATIONALITY_OPTIONS = function_exists('subscriber_identity_nationalities') ? subscriber_identity_nationalities($conn) : ['سوري','فلسطيني سوري'];

function se_row_text(array $row, string $key, string $fallback=''): string {
  return isset($row[$key]) ? trim((string)$row[$key]) : $fallback;
}

function se_pick_file(array $row, array $keys): string {
  foreach($keys as $k){
    $v = trim((string)($row[$k] ?? ''));
    if($v !== '') return $v;
  }
  return '';
}

function se_safe_upload(string $key, string $prefix): ?string {
  return function_exists('subscriber_identity_upload') ? subscriber_identity_upload($key, $prefix) : null;
}

function se_select_current(array $row, string $nameKey, array $rows, string $rowNameKey): string {
  $v = trim((string)($row[$nameKey] ?? ''));
  if($v !== '') return $v;
  return '';
}

if(!$id){
  echo "<div class='content-wrapper'><section class='content p-3'><div class='alert alert-danger'>مشترك غير صالح.</div></section></div>";
  include __DIR__ . '/footer.php';
  exit;
}

$row = $conn->query("SELECT * FROM subscribers WHERE id=$id LIMIT 1")->fetch_assoc();
if(!$row){
  echo "<div class='content-wrapper'><section class='content p-3'><div class='alert alert-danger'>المشترك غير موجود.</div></section></div>";
  include __DIR__ . '/footer.php';
  exit;
}

$msg=''; $err='';
$serialChangedFrom = 0;
try {
  // This schema preparation must happen before the save transaction because DDL commits implicitly in MySQL.
  ua_subscriber_id_registry_ensure($conn);
} catch (Throwable $e) {
  $err = $e->getMessage();
}
$subscriberIdPolicy = ua_subscriber_id_series_policy($conn, $id);
$agentContractTemplate = $uaAgentEditContext ? sc_default_template($conn) : null;
if ($uaAgentEditContext && $_SERVER['REQUEST_METHOD'] === 'POST' && !ua_csrf_verify()) {
  $err = 'انتهت صلاحية الطلب. أعد تحميل الصفحة ثم حاول مجدداً.';
}

$SYNC_SPEEDS_JSON = get_app_setting($conn, "pppoe_speed_options_json", "");
$SYNC_SPEEDS = [];
if (trim($SYNC_SPEEDS_JSON) !== "") {
  $tmp = json_decode($SYNC_SPEEDS_JSON, true);
  if (is_array($tmp)) {
    $SYNC_SPEEDS = array_values(array_filter($tmp, function($v){
      return is_string($v) && trim($v) !== "";
    }));
  }
}
$FIXED_SPEEDS = !empty($SYNC_SPEEDS) ? $SYNC_SPEEDS : ["1M","2M","4M","8M","16M"];
$FIXED_PACKAGES = ['50G','75G','100G','125G','مفتوح'];


$SE_SPEED_ROWS = se_fetch_speeds($conn);
$SE_PACKAGE_ROWS = se_fetch_packages($conn);
$SE_SECTOR_ROWS = se_fetch_sectors($conn);
if (!empty($SE_SPEED_ROWS)) {
  $fromTable = [];
  foreach($SE_SPEED_ROWS as $sr){ $n = trim((string)($sr['speed_name'] ?? '')); if($n !== '') $fromTable[] = $n; }
  if(!empty($fromTable)) $FIXED_SPEEDS = array_values(array_unique($fromTable));
}
if (!empty($SE_PACKAGE_ROWS)) {
  $fromTable = [];
  foreach($SE_PACKAGE_ROWS as $pr){ $n = trim((string)($pr['package_name'] ?? '')); if($n !== '') $fromTable[] = $n; }
  if(!empty($fromTable)) $FIXED_PACKAGES = array_values(array_unique($fromTable));
}

$currentSpeedName = trim((string)($row['speed_name'] ?? ''));
if($currentSpeedName !== '' && !in_array($currentSpeedName, $FIXED_SPEEDS, true)) array_unshift($FIXED_SPEEDS, $currentSpeedName);
$currentPackageName = trim((string)($row['package_name'] ?? ''));
if($currentPackageName !== '' && !in_array($currentPackageName, $FIXED_PACKAGES, true)) array_unshift($FIXED_PACKAGES, $currentPackageName);
$FIXED_SPEEDS = array_values(array_unique($FIXED_SPEEDS));
$FIXED_PACKAGES = array_values(array_unique($FIXED_PACKAGES));


function se_trim($v): string {
  return trim((string)$v);
}

function se_ppp_profile_safe(string $speedName, string $packageName, string $fallback = ''): string {
  $fallback = trim($fallback);
  try {
    if (function_exists('ppp_profile_from_speed')) {
      $p = trim((string)ppp_profile_from_speed($speedName, $packageName, $fallback !== '' ? $fallback : 'pppoe-profile'));
      if ($p !== '') return $p;
    }
  } catch (Throwable $e) {}

  if (preg_match('/(\d{1,3})\s*M/i', $speedName, $m)) return 'PPPOE-' . (int)$m[1] . 'M';
  if (preg_match('/^(\d{1,3})$/', $speedName, $m)) return 'PPPOE-' . (int)$m[1] . 'M';
  if (preg_match('/(\d{1,3})\s*M/i', $packageName, $m)) return 'PPPOE-' . (int)$m[1] . 'M';
  return $fallback !== '' ? $fallback : 'pppoe-profile';
}

function se_old_ppp_user(array $row): string {
  $u = se_trim($row['ppp_username'] ?? '');
  return $u !== '' ? $u : se_trim($row['username'] ?? '');
}

function se_old_ppp_pass(array $row): string {
  $p = se_trim($row['ppp_password'] ?? '');
  if ($p !== '') return $p;
  $p = se_trim($row['password_plain'] ?? '');
  if ($p !== '') return $p;
  return se_trim($row['sub_password'] ?? '');
}

function se_old_profile(array $row): string {
  foreach (['ppp_profile','pppoe_profile','mt_profile'] as $k) {
    $v = se_trim($row[$k] ?? '');
    if ($v !== '') return $v;
  }
  return '';
}

function se_old_rate(array $row): string {
  foreach (['ppp_rate_limit','mt_rate_limit'] as $k) {
    $v = se_trim($row[$k] ?? '');
    if ($v !== '') return $v;
  }
  return '';
}

if(isset($_POST['stage_encrypt_account'])){
  $res = (function_exists('ua_csrf_verify') && !ua_csrf_verify())
    ? ['ok'=>false,'message'=>'انتهت صلاحية الطلب. أعد تحميل الصفحة ثم حاول مجدداً.']
    : subs_stage_policy_account($conn, $id);
  if(!empty($res['ok'])){
    $msg = $res['message'] ?? 'تم تشفير الحساب حسب سياسة البرنامج ✅';
    $row = $conn->query("SELECT * FROM subscribers WHERE id=$id LIMIT 1")->fetch_assoc();
    @audit_log($conn, 'SUBSCRIBER_ACCOUNT_ENCRYPT_STAGE_BUTTON', 'subscribers', $id, 'pending='.(string)($res['username'] ?? ''));
  } else {
    $err = $res['message'] ?? 'فشل تشفير الحساب.';
  }
}

if(isset($_POST['apply_encrypt_account'])){
  $res = (function_exists('ua_csrf_verify') && !ua_csrf_verify())
    ? ['ok'=>false,'message'=>'انتهت صلاحية الطلب. أعد تحميل الصفحة ثم حاول مجدداً.']
    : subs_apply_staged_policy_account($conn, $id);
  if(!empty($res['ok'])){
    $msg = $res['message'] ?? 'تم تطبيق الحساب المشفر.';
    $row = $conn->query("SELECT * FROM subscribers WHERE id=$id LIMIT 1")->fetch_assoc();
    @audit_log($conn, 'SUBSCRIBER_ACCOUNT_ENCRYPT_APPLY_BUTTON', 'subscribers', $id, 'ppp_user='.(string)($res['username'] ?? ''));
  } else {
    $err = $res['message'] ?? 'فشل تطبيق الحساب المشفر.';
  }
}

if(!$err && isset($_POST['save'])){
  $originalSubscriberId = $id;
  $requestedSubscriberIdRaw = trim((string)($_POST['subscriber_serial'] ?? (string)$id));
  $requestedSubscriberId = $uaAgentEditContext ? $id : (ctype_digit($requestedSubscriberIdRaw) ? (int)$requestedSubscriberIdRaw : 0);
  if (!$uaAgentEditContext) {
    $serialError = ua_subscriber_id_candidate_error($subscriberIdPolicy, $id, $requestedSubscriberIdRaw);
    if ($serialError !== '') $err = $serialError;
    if (!$err) {
      $serialError = ua_subscriber_id_availability_error($conn, $id, $requestedSubscriberId);
      if ($serialError !== '') $err = $serialError;
    }
  }
  $subscriberIdChanged = !$uaAgentEditContext && $requestedSubscriberId !== $id;
  $username = trim($_POST['username'] ?? '');
  $firstName = trim((string)($_POST['first_name'] ?? ''));
  $fatherName = trim((string)($_POST['father_name'] ?? ''));
  $lastName = trim((string)($_POST['last_name'] ?? ''));
  $motherName = trim((string)($_POST['mother_name'] ?? ''));
  $birthDate = trim((string)($_POST['birth_date'] ?? ''));
  $nationalId = trim((string)($_POST['national_id'] ?? ''));
  $recordNumber = trim((string)($_POST['record_number'] ?? ''));
  $documentTypeRaw = trim((string)($_POST['document_type'] ?? 'هوية شخصية'));
  $documentType = function_exists('subscriber_document_type_normalize')
    ? subscriber_document_type_normalize($documentTypeRaw)
    : ($documentTypeRaw ?: 'هوية شخصية');
  $nationality = trim((string)($_POST['nationality'] ?? 'سوري')) ?: 'سوري';
  $documentNumber = trim((string)($_POST['document_number'] ?? ''));
  $notes = trim((string)($_POST['notes'] ?? ''));
  $sectorId = (int)($_POST['sector_id'] ?? 0);
  $vlanId = null;
  foreach($SE_SECTOR_ROWS as $sr){
    if((int)($sr['id'] ?? 0) === $sectorId){
      $vlanId = isset($sr['vlan_id']) && $sr['vlan_id'] !== '' ? (int)$sr['vlan_id'] : null;
      break;
    }
  }
  $postedFull = trim((string)($_POST['full_name'] ?? ''));
  $builtFull = trim(preg_replace('/\s+/u', ' ', trim($firstName . ' ' . $fatherName . ' ' . $lastName)) ?? '');
  $full = $builtFull !== '' ? $builtFull : $postedFull;
  $phone    = trim($_POST['phone'] ?? '');
  $ip       = subs_static_ip_normalize((string)($_POST['ip_address'] ?? ''));
  $address  = trim($_POST['address_area'] ?? '');
  $postedPlainPass = trim($_POST['password_plain'] ?? '');
  $postedPppPass = trim((string)($_POST['ppp_password'] ?? ''));
  $package_name = trim($_POST['package_name'] ?? '');
  $speed_name   = trim($_POST['speed_name'] ?? '');
  $agentStatusProtected = isset($_POST['agent_status_protected']) ? 1 : 0;
  $agentStatusPassword = trim((string)($_POST['agent_status_password'] ?? ''));

  $ppp_auto = isset($_POST['ppp_auto']) ? 1 : 0;
  $oldUser = se_old_ppp_user($row);
  $oldPlainPass = se_trim($row['password_plain'] ?? '');
  $oldPppPass = se_old_ppp_pass($row);
  $oldProfile = se_old_profile($row);
  $oldRate = se_old_rate($row);
  $oldIp = subs_static_ip_normalize((string)($row['ip_address'] ?? ''));
  $ipChanged = ($ip !== $oldIp);
  $staticIpPoolWarnings = [];

  $ppp_user = trim((string)($_POST['ppp_username'] ?? $username));
  if ($ppp_user === '') $ppp_user = $username;

  // تم إخفاء حقل Password العام من الواجهة. المصدر الوحيد الظاهر لكلمة مرور المشترك هو PPPoE Password.
  // نبقي password_plain محدثاً داخلياً بنفس كلمة مرور PPPoE حتى لا تتعطل الصفحات القديمة التي تقرأ منه.
  $ppp_pass = $postedPppPass !== '' ? $postedPppPass : ($postedPlainPass !== '' ? $postedPlainPass : $oldPppPass);
  $pass = $ppp_pass;

  $postedProfile = trim((string)($_POST['ppp_profile'] ?? ''));
  $ppp_profile = $postedProfile;
  $ppp_rate = trim((string)($_POST['ppp_rate_limit'] ?? ''));

  if ($ppp_auto === 1) {
    $ppp_profile = se_ppp_profile_safe($speed_name, $package_name, $postedProfile);
  }

  if($username==='' || $full===''){
    $err = 'الرجاء إدخال اسم المستخدم والاسم الكامل';
  }
  if(!$err){
    $ipErr = subs_static_ip_validate($ip);
    if($ipErr !== '') $err = $ipErr;
  }
  if(!$err && $ip !== ''){
    $dbConflict = subs_static_ip_db_conflict($conn, $ip, $id);
    if($dbConflict){
      $who = trim((string)($dbConflict['ppp_username'] ?? $dbConflict['username'] ?? ''));
      $name = trim((string)($dbConflict['full_name'] ?? ''));
      $err = 'هذا الـ IP مستخدم مسبقاً لمشترك آخر في قاعدة البيانات' . ($who !== '' ? ': '.$who : '') . ($name !== '' ? ' - '.$name : '');
    }
  }
  if(!$err && $ipChanged && $ppp_auto !== 1){
    $err = 'تعديل IP الثابت يحتاج تفعيل خيار تحديث حساب PPPoE على MikroTik.';
  }
  if(!$err && $speed_name!=='' && !in_array($speed_name,$FIXED_SPEEDS,true)) $err='سرعة غير صالحة';
  if(!$err && $package_name!=='' && !in_array($package_name,$FIXED_PACKAGES,true)) $err='باقة غير صالحة';
  if(!$err && $documentType === '') $err='نوع الوثيقة غير صالح';
  if(!$err && $agentStatusProtected && $agentStatusPassword === '' && trim((string)($row['agent_status_password_hash'] ?? '')) === ''){
    $err = 'حماية سجل المشترك تحتاج كلمة مرور خاصة أول مرة.';
  }

  $mtChanges = [];
  if ($ppp_auto === 1) {
    if ($ppp_user !== $oldUser) $mtChanges[] = 'اسم حساب PPPoE';
    if ($ppp_pass !== '' && $ppp_pass !== $oldPppPass) $mtChanges[] = 'كلمة مرور PPPoE';
    if ($ppp_profile !== '' && $ppp_profile !== $oldProfile) $mtChanges[] = 'بروفايل PPPoE';
    if ($ppp_rate !== $oldRate) $mtChanges[] = 'Rate-Limit';
    if ($ipChanged) $mtChanges[] = ($ip !== '' ? ('تثبيت IP ثابت: '.$ip) : 'إلغاء تثبيت IP الثابت');
  }
  $needsMtUpdate = $ppp_auto === 1 && !empty($mtChanges);

  if (!$err && $needsMtUpdate && empty($_POST['mt_confirmed'])) {
    $err = 'لم يتم تأكيد تعديل حساب MikroTik. اضغط حفظ مرة أخرى ووافق على رسالة التأكيد.';
  }

  if (!$err && $needsMtUpdate) {
    try {
      mt_require_router_online_or_throw($conn, 'تعديل بيانات المشترك على MikroTik');
    } catch (Throwable $e) {
      $err = $e->getMessage();
    }
  }

  if(!$err && $needsMtUpdate && $ipChanged && $ip !== ''){
    $mtIpCheck = mt_ppp_static_ip_preflight($conn, $ip, $ppp_user);
    if(empty($mtIpCheck['ok'])){
      $err = $mtIpCheck['message'] ?? 'فشل فحص تكرار الـ IP على MikroTik.';
    } else {
      $staticIpPoolWarnings = $mtIpCheck['pool_hits'] ?? [];
      $blockPoolOverlap = trim((string)setting_get($conn, 'pppoe_static_ip_block_pool_overlap', '0')) === '1';
      if($blockPoolOverlap && !empty($staticIpPoolWarnings)){
        $pools = [];
        foreach($staticIpPoolWarnings as $ph){
          $pools[] = trim((string)($ph['name'] ?? 'pool')) . ' [' . trim((string)($ph['range'] ?? '')) . ']';
        }
        $err = 'هذا الـ IP يقع داخل IP Pool ديناميكي على MikroTik، وهذا قد يسبب تكراراً مستقبلياً. اختر IP خارج الـ Pool أو احجز رينج خاص للـ Static IP. التفاصيل: '.implode('، ', $pools);
      }
    }
  }

  if(!$err){
    $frontPath = se_safe_upload('id_card_front', 'front');
    $backPath  = se_safe_upload('id_card_back', 'back');
    $pdfPath   = se_safe_upload('id_card_pdf', 'pdf');

    $sets = subscriber_edit_build_update_sets($conn, [
      'username'       => $username,
      'full_name'      => $full,
      'first_name'     => $firstName,
      'father_name'    => $fatherName,
      'last_name'      => $lastName,
      'mother_name'    => $motherName,
      'birth_date'     => $birthDate,
      'national_id'    => $nationalId,
      'record_number'  => $recordNumber,
      'document_type'  => $documentType,
      'nationality'    => $nationality,
      'document_number'=> $documentNumber,
      'notes'          => $notes,
      'sector_id'      => $sectorId,
      'vlan_id'        => $vlanId,
      'phone'          => $phone,
      'ip_address'     => $ip,
      'address_area'   => $address,
      'password_plain' => $pass,
      'package_name'   => $package_name,
      'speed_name'     => $speed_name,
      'ppp_username'   => $ppp_user,
      'ppp_password'   => $ppp_pass,
      'ppp_profile'    => $ppp_profile,
      'ppp_rate_limit' => $ppp_rate,
    ], [
      'front' => $frontPath,
      'back'  => $backPath,
      'pdf'   => $pdfPath,
    ]);
    if (col_exists($conn, 'subscribers', 'agent_status_protected')) {
      $sets[] = "`agent_status_protected`=" . (int)$agentStatusProtected;
    }
    if (col_exists($conn, 'subscribers', 'agent_status_password_hash')) {
      if (!$agentStatusProtected) {
        $sets[] = "`agent_status_password_hash`=NULL";
      } elseif ($agentStatusPassword !== '') {
        $sets[] = "`agent_status_password_hash`='" . $conn->real_escape_string(password_hash($agentStatusPassword, PASSWORD_DEFAULT)) . "'";
      }
    }

    $sql = "UPDATE subscribers SET ".implode(',',$sets)." WHERE id=$id";
    $conn->begin_transaction();
    try {
      if(!$conn->query($sql)){
        throw new RuntimeException('DB Error: '.$conn->error);
      }

      // Reload updated row before provisioning so MikroTik receives the exact same values saved locally.
      $row = $conn->query("SELECT * FROM subscribers WHERE id=$id LIMIT 1")->fetch_assoc();
      if (!$row) throw new RuntimeException('تعذر إعادة قراءة بيانات المشترك بعد الحفظ.');

      $removeWarning = '';
      if($needsMtUpdate){
        $prov = subs_pppoe_provision($conn, $row, true, true);
        if(empty($prov['ok'])){
          throw new RuntimeException('فشل تحديث MikroTik: ' . (string)($prov['message'] ?? 'سبب غير معروف'));
        }

        $newUser = se_old_ppp_user($row);
        if($ipChanged){
          if(!mt_ppp_secret_set_remote_address($conn, $newUser, $ip, true)){
            throw new RuntimeException('فشل تثبيت/تحديث IP على MikroTik: ' . (string)($GLOBALS['mt_last_error'] ?? 'سبب غير معروف'));
          }
        }

        if($oldUser !== '' && $newUser !== '' && $oldUser !== $newUser){
          if (!subs_pppoe_remove($conn, $oldUser)) {
            $removeWarning = ' — تنبيه: تم إنشاء/تحديث الحساب الجديد لكن لم يتم حذف الحساب القديم من MikroTik: ' . ($GLOBALS['mt_last_error'] ?? 'سبب غير معروف');
          }
        }

        if(col_exists($conn,'subscribers','ppp_last_sync')) {
          @ $conn->query("UPDATE subscribers SET ppp_last_sync=NOW() WHERE id=$id LIMIT 1");
        }
      }

      if ($subscriberIdChanged) {
        ua_subscriber_change_id_in_transaction($conn, $id, $requestedSubscriberId, 'subscriber_edit');
        $id = $requestedSubscriberId;
      }

      $conn->commit();
      if ($subscriberIdChanged) {
        $serialChangedFrom = $originalSubscriberId;
        try { ua_subscriber_ensure_id_sequence($conn); } catch (Throwable $sequenceError) {
          $sequenceWarning = ' — تنبيه: تم تغيير الرقم بنجاح، لكن تعذرت مزامنة عداد الأرقام التلقائي: ' . $sequenceError->getMessage();
        }
      }
      $row = $conn->query("SELECT * FROM subscribers WHERE id=$id LIMIT 1")->fetch_assoc();

      if($needsMtUpdate){
        $msg = 'تم حفظ التعديل وتحديث حساب MikroTik ✅' . $removeWarning;
        if($ipChanged && $ip !== '' && !empty($staticIpPoolWarnings)){
          $poolNames = [];
          foreach($staticIpPoolWarnings as $ph){ $poolNames[] = trim((string)($ph['name'] ?? 'pool')); }
          $msg .= ' — تنبيه احترافي: الـ IP داخل Pool ديناميكي (' . implode('، ', array_unique($poolNames)) . '). الأفضل حجز رينج Static خارج الـ Pool لمنع أي تكرار مستقبلي.';
        }
      } else {
        $msg = 'تم التعديل ✅';
      }
      if ($subscriberIdChanged) {
        $msg .= ' — تم تغيير الرقم التسلسلي من #' . $originalSubscriberId . ' إلى #' . $id . ' ضمن السلسلة ' . (string)$subscriberIdPolicy['prefix'] . '، وبقي الرقم السابق محجوزاً في السجل التاريخي.' . ($sequenceWarning ?? '');
      }

      // سجل عملية التعديل
      $detail = 'username='.($username ?: '').'; full_name='.$full.'; ppp_user='.$ppp_user.'; ip='.$ip.'; phone='.$phone.'; address='.$address.'; national_id='.$nationalId.'; sector_id='.$sectorId.'; subscriber_serial='.$originalSubscriberId.'->'.$id.'; mt_changes='.implode('|',$mtChanges);
      @audit_log($conn, 'SUBSCRIBER_EDIT', 'subscribers', $id, $detail);

      unset($_SESSION[$super_edit_gate_key]);
    } catch (Throwable $e) {
      try { $conn->rollback(); } catch (Throwable $ignore) {}
      $id = $originalSubscriberId;
      $err = $e->getMessage();
      $row = $conn->query("SELECT * FROM subscribers WHERE id=$id LIMIT 1")->fetch_assoc();
    }
  }
}

$active_tab = 'list';
?>

<div class="content-wrapper ua-edit-contract-page">
  <section class="content">
    <div class="ua-form-shell ua-edit-shell">
      <?php if ($uaAndroidEdit): ?>
        <header class="ase-heading">
          <div>
            <span>المشترك #<?= (int)$id ?></span>
            <h1>تعديل بيانات المشترك</h1>
            <p><?= h(trim((string)($row['full_name'] ?? '')) ?: (string)($row['ppp_username'] ?? $row['username'] ?? '')) ?></p>
          </div>
          <a href="subscribers_view.php?id=<?= (int)$id ?>"><i class="fa fa-eye"></i><b>عرض</b></a>
        </header>
        <ol class="ase-steps" aria-label="أقسام تعديل المشترك">
          <li class="is-current"><i>1</i><span>البيانات</span></li>
          <li><i>2</i><span>الخدمة</span></li>
          <li><i>3</i><span>الحفظ</span></li>
        </ol>
      <?php endif; ?>
      <?php if($msg){ ?><div class="ua-alert alert-success"><?= h($msg) ?></div><?php } ?>
      <?php if($err){ ?><div class="ua-alert alert-danger"><?= h($err) ?></div><?php } ?>
      <?php if($uaAgentEditContext): ?>
        <section class="ap-contract-print-box ua-agent-edit-contract-box">
          <div class="ap-card-title"><i class="fa fa-file-word-o"></i><div><h2>طباعة عقد المشترك</h2><p>احفظ التعديلات أولاً، ثم اختر طريقة توليد العقد من القالب المعتمد.</p></div></div>
          <?php if($agentContractTemplate): ?>
            <form method="post" action="agent_contract_download.php" class="ap-contract-print-form" id="agentEditContractPrintForm">
              <?php ua_csrf_field(); ?>
              <input type="hidden" name="agent" value="<?= (int)$uaAgentEditId ?>">
              <input type="hidden" name="subscriber_id" value="<?= (int)$id ?>">
              <input type="hidden" name="agent_edit_token" value="<?= h($uaAgentEditToken) ?>">
              <div class="ap-contract-template-name"><i class="fa fa-check-circle"></i> القالب المعتمد: <strong><?= h((string)$agentContractTemplate['name']) ?></strong></div>
              <label><input type="radio" name="contract_mode" value="full" checked><span><strong>طباعة كامل العقد</strong><small>جميع صفحات القالب.</small></span></label>
              <label><input type="radio" name="contract_mode" value="changed"><span><strong>الصفحات المعبأة فقط</strong><small>الصفحات التي تحتوي على بيانات مدرجة.</small></span></label>
              <div class="ap-contract-print-actions">
                <button class="btn btn-primary" type="button" data-ua-print-contract data-form="#agentEditContractPrintForm" data-delivery="print"><i class="fa fa-print"></i> توليد وطباعة العقد</button>
                <button class="btn" type="submit" name="delivery" value="download"><i class="fa fa-download"></i> تنزيل ملف Word</button>
              </div>
            </form>
          <?php else: ?>
            <div class="ua-alert alert-warning">لا يوجد قالب عقد معتمد في النسخة الرئيسية.</div>
          <?php endif; ?>
        </section>
      <?php endif; ?>

      <form method="post" id="subscriberEditForm" enctype="multipart/form-data" <?= $uaAndroidEdit ? 'data-ua-android-native-layout' : '' ?>>
        <?php ua_csrf_field(); ?>
        <?php if($uaAgentEditContext): ?>
          <input type="hidden" name="agent" value="<?= (int)$uaAgentEditId ?>">
          <input type="hidden" name="agent_edit_token" value="<?= h($uaAgentEditToken) ?>">
        <?php endif; ?>
        <input type="hidden" name="mt_confirmed" id="mtConfirmed" value="0">
        <input type="hidden" name="full_name" id="fullNameHidden" value="<?= h($row['full_name'] ?? '') ?>">
        <input type="hidden" name="password_plain" id="plainPassword" value="<?= h($row['ppp_password'] ?? $row['password_plain'] ?? '') ?>">
        <?php
          $seVisibleSectorId = (int)($row['sector_id'] ?? 0);
          if($seVisibleSectorId <= 0 && !empty($SE_SECTOR_ROWS)) $seVisibleSectorId = (int)($SE_SECTOR_ROWS[0]['id'] ?? 0);
        ?>
        <input type="hidden" name="sector_id" value="<?= (int)$seVisibleSectorId ?>">

        <div class="ua-form-layout ua-edit-layout">
          <div class="ua-form-main ua-edit-main">

            <div class="ua-form-card ua-edit-personal-card">
              <div class="ua-form-card-head">
                <h3>بيانات المشترك</h3>
              </div>
              <div class="ua-form-card-body">
                <div class="ua-form-grid ua-edit-personal-grid">
                  <?php if(!$uaAgentEditContext): ?>
                  <div class="ua-form-field is-span-2 ua-subscriber-serial-field">
                    <label for="subscriberSerial">الرقم التسلسلي للمشترك</label>
                    <input type="text" name="subscriber_serial" id="subscriberSerial" class="form-control ua-form-control" inputmode="numeric" autocomplete="off" value="<?= (int)$id ?>" data-current-id="<?= (int)$id ?>" data-series-prefix="<?= h((string)$subscriberIdPolicy['prefix']) ?>" data-min-length="<?= (int)$subscriberIdPolicy['min_length'] ?>" required>
                    <small class="ua-subscriber-serial-help">السلسلة المعتمدة على هذا الجهاز: <b dir="ltr"><?= h((string)$subscriberIdPolicy['prefix']) ?>…</b>، وبحد أدنى <?= (int)$subscriberIdPolicy['min_length'] ?> خانات. الرقم السابق يبقى محجوزاً ولا يمكن استخدامه مجدداً.</small>
                  </div>
                  <?php else: ?>
                    <input type="hidden" name="subscriber_serial" value="<?= (int)$id ?>">
                  <?php endif; ?>
                  <div class="ua-form-field">
                    <label>اسم المستخدم</label>
                    <input name="username" id="editUsername" class="form-control ua-form-control" value="<?= h($row['username'] ?? '') ?>" required>
                  </div>
                  <div class="ua-form-field">
                    <label>الاسم</label>
                    <input name="first_name" class="form-control ua-form-control js-name-part" value="<?= h(se_row_text($row,'first_name')) ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>اسم الأب</label>
                    <input name="father_name" class="form-control ua-form-control js-name-part" value="<?= h(se_row_text($row,'father_name')) ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>الكنية</label>
                    <input name="last_name" class="form-control ua-form-control js-name-part" value="<?= h(se_row_text($row,'last_name')) ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>اسم الأم</label>
                    <input name="mother_name" class="form-control ua-form-control" value="<?= h(se_row_text($row,'mother_name')) ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>تاريخ الميلاد</label>
                    <input type="date" name="birth_date" class="form-control ua-form-control" value="<?= h(se_row_text($row,'birth_date')) ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>نوع الوثيقة</label>
                    <?php $currentDocumentType=se_row_text($row,'document_type','هوية شخصية') ?: 'هوية شخصية'; ?>
                    <select name="document_type" class="form-select ua-form-control" required><?php foreach((function_exists('subscriber_document_types') ? subscriber_document_types() : ['هوية شخصية','إخراج قيد','جواز سفر']) as $type): ?><option value="<?= h($type) ?>" <?= $currentDocumentType===$type?'selected':'' ?>><?= h($type) ?></option><?php endforeach; ?></select>
                  </div>
                  <div class="ua-form-field">
                    <label>الجنسية</label>
                    <input name="nationality" class="form-control ua-form-control" list="subscriberNationalityOptionsEdit" value="<?= h(se_row_text($row,'nationality','سوري') ?: 'سوري') ?>" required autocomplete="off">
                  </div>
                  <div class="ua-form-field">
                    <label>رقم الوثيقة</label>
                    <input name="document_number" class="form-control ua-form-control" value="<?= h(se_row_text($row,'document_number')) ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>رقم الهاتف</label>
                    <input name="phone" class="form-control ua-form-control" inputmode="tel" value="<?= h($row['phone'] ?? '') ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>القيد</label>
                    <input name="record_number" class="form-control ua-form-control" value="<?= h(se_row_text($row,'record_number')) ?>">
                  </div>
                  <div class="ua-form-field is-span-2">
                    <label>الرقم الوطني <button type="button" class="ua-form-help-tip" aria-label="تلميح" data-tip="يمكن إدخاله يدويا أو تمريره مباشرة من قارئ الباركود إذا كان يعمل كلوحة مفاتيح.">؟</button></label>
                    <input name="national_id" class="form-control ua-form-control" inputmode="numeric" value="<?= h(se_row_text($row,'national_id')) ?>">
                  </div>
                  <div class="ua-form-field is-full">
                    <label>العنوان الحالي</label>
                    <input name="address_area" class="form-control ua-form-control" value="<?= h($row['address_area'] ?? '') ?>">
                  </div>
                  <div class="ua-form-field is-full">
                    <label>ملاحظات</label>
                    <textarea name="notes" class="form-control ua-form-control" rows="2"><?= h(se_row_text($row,'notes')) ?></textarea>
                  </div>
                </div>
                <datalist id="subscriberNationalityOptionsEdit"><?php foreach($SE_NATIONALITY_OPTIONS as $nationalityOption): ?><option value="<?= h($nationalityOption) ?>"><?php endforeach; ?></datalist>
              </div>
            </div>

            <div class="ua-form-card ua-edit-account-card">
              <div class="ua-form-card-head">
                <h3>الخدمة والحساب</h3>
              </div>
              <div class="ua-form-card-body">
                <div class="ua-form-grid ua-edit-service-grid">
                  <div class="ua-form-field">
                    <label>السرعة</label>
                    <select name="speed_name" id="speedName" class="form-select ua-form-control">
                      <option value="">— اختر السرعة —</option>
                      <?php foreach($FIXED_SPEEDS as $s): ?>
                        <option value="<?= h($s) ?>" <?= (($row['speed_name'] ?? '')===$s?'selected':'') ?>><?= h($s) ?></option>
                      <?php endforeach; ?>
                    </select>
                  </div>
                  <div class="ua-form-field">
                    <label>الباقة</label>
                    <select name="package_name" id="packageName" class="form-select ua-form-control">
                      <option value="">— اختر الباقة —</option>
                      <?php foreach($FIXED_PACKAGES as $px): ?>
                        <option value="<?= h($px) ?>" <?= (($row['package_name'] ?? '')===$px?'selected':'') ?>><?= h($px) ?></option>
                      <?php endforeach; ?>
                    </select>
                  </div>
                  <div class="ua-form-field">
                    <label>IP ثابت للمشترك <button type="button" class="ua-form-help-tip" id="staticIpHelpBtn" aria-label="شرح تثبيت IP على MikroTik" data-tip="اختياري، إذا ترك فارغ يأخذ المشترك IP من الـ Pool.">؟</button></label>
                    <div class="se-static-ip-control ua-form-inline-control">
                      <input name="ip_address" id="staticIp" dir="ltr" inputmode="numeric" autocomplete="off" class="form-control ua-form-control" placeholder="192.168.1.100" value="<?= h($row['ip_address'] ?? '') ?>">
                      <button type="button" id="suggestStaticIpBtn" class="btn ua-form-icon-btn ua-form-ip-suggest-btn" title="اقتراح IP ثابت متاح من MikroTik" aria-label="اقتراح IP ثابت متاح من MikroTik"><i class="fa fa-magic"></i></button>
                    </div>
                    <small class="text-muted se-inline-hidden-hint" id="staticIpHint">عند وضع IP صحيح يتم تثبيته على MikroTik كـ remote-address.</small>
                  </div>
                </div>

                <div class="ua-form-grid ua-edit-pppoe-grid">
                  <div class="ua-form-field ua-form-check-field">
                    <div class="form-check ua-form-check">
                      <input class="form-check-input se-ppp-toggle-input" type="checkbox" name="ppp_auto" value="1" id="pppAuto" checked>
                      <label class="form-check-label se-ppp-toggle-button" for="pppAuto">
                        <span class="se-ppp-toggle-text">PPPoE (MikroTik)</span>
                        <span class="se-ppp-toggle-state" data-on="مفعل" data-off="متوقف">مفعل</span>
                      </label>
                    </div>
                  </div>
                  <div class="ua-form-field">
                    <label>PPPoE User</label>
                    <input name="ppp_username" id="pppUsername" class="form-control ua-form-control" value="<?= h($row['ppp_username'] ?? $row['username'] ?? '') ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>PPPoE Password</label>
                    <input name="ppp_password" id="pppPassword" class="form-control ua-form-control" value="<?= h($row['ppp_password'] ?? $row['password_plain'] ?? '') ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>PPPoE Profile</label>
                    <input name="ppp_profile" id="pppProfile" class="form-control ua-form-control" value="<?= h($row['ppp_profile'] ?? $row['pppoe_profile'] ?? '') ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>Rate-Limit</label>
                    <input name="ppp_rate_limit" id="pppRate" class="form-control ua-form-control" value="<?= h($row['ppp_rate_limit'] ?? '') ?>">
                  </div>
                </div>
              </div>
            </div>

            <?php
              $frontFile = se_pick_file($row, ['id_card_front','id_front']);
              $backFile = se_pick_file($row, ['id_card_back','id_back']);
              $pdfFile = se_pick_file($row, ['id_pdf']);
              $hasIdColumns = col_exists($conn,'subscribers','id_card_front') || col_exists($conn,'subscribers','id_front') || col_exists($conn,'subscribers','id_card_back') || col_exists($conn,'subscribers','id_back') || col_exists($conn,'subscribers','id_pdf');
            ?>
            <?php if($hasIdColumns): ?>
            <div class="ua-form-card ua-edit-identity-card">
              <div class="ua-form-card-head">
                <h3>الهوية والمرفقات</h3>
              </div>
              <div class="ua-form-card-body">
                <div class="ua-form-grid ua-edit-upload-grid">
                  <div class="ua-form-field">
                    <label>صورة الهوية - الوجه الأمامي</label>
                    <?php if($frontFile !== ''): ?><a class="ua-form-current-file" href="<?= h($frontFile) ?>" target="_blank"><i class="fa fa-link"></i> الملف الحالي</a><?php endif; ?>
                    <label class="ua-form-file-upload">
                      <input type="file" name="id_card_front" accept=".jpg,.jpeg,.png,.webp,.pdf,image/*,application/pdf" capture="environment">
                      <span>اضغط للرفع</span>
                      <small>JPG, PNG</small>
                    </label>
                  </div>
                  <div class="ua-form-field">
                    <label>صورة الهوية - الوجه الخلفي</label>
                    <?php if($backFile !== ''): ?><a class="ua-form-current-file" href="<?= h($backFile) ?>" target="_blank"><i class="fa fa-link"></i> الملف الحالي</a><?php endif; ?>
                    <label class="ua-form-file-upload">
                      <input type="file" name="id_card_back" accept=".jpg,.jpeg,.png,.webp,.pdf,image/*,application/pdf" capture="environment">
                      <span>اضغط للرفع</span>
                      <small>JPG, PNG</small>
                    </label>
                  </div>
                  <div class="ua-form-field">
                    <label>ملف هوية واحد PDF</label>
                    <?php if($pdfFile !== ''): ?><a class="ua-form-current-file" href="<?= h($pdfFile) ?>" target="_blank"><i class="fa fa-link"></i> الملف الحالي</a><?php endif; ?>
                    <label class="ua-form-file-upload">
                      <input type="file" name="id_card_pdf" accept=".pdf,application/pdf">
                      <span>اضغط للرفع</span>
                      <small>PDF فقط</small>
                    </label>
                  </div>
                </div>
              </div>
            </div>
            <?php endif; ?>

            <?php if(col_exists($conn,'subscribers','agent_status_protected') && col_exists($conn,'subscribers','agent_status_password_hash')): ?>
            <div class="ua-form-card ua-edit-identity-card">
              <div class="ua-form-card-head">
                <h3>حماية سجل المشترك للمعتمدين</h3>
              </div>
              <div class="ua-form-card-body">
                <div class="ua-form-grid ua-edit-upload-grid">
                  <div class="ua-form-field">
                    <label class="form-check ua-form-check">
                      <input class="form-check-input" type="checkbox" name="agent_status_protected" value="1" <?= !empty($row['agent_status_protected']) ? 'checked' : '' ?>>
                      <span class="form-check-label">السجل محمي بكلمة مرور خاصة</span>
                    </label>
                  </div>
                  <div class="ua-form-field">
                    <label>كلمة مرور الاستعلام</label>
                    <input type="password" name="agent_status_password" class="form-control ua-form-control" autocomplete="new-password" placeholder="<?= trim((string)($row['agent_status_password_hash'] ?? '')) !== '' ? 'اتركها فارغة للإبقاء على الحالية' : 'أدخل كلمة مرور جديدة' ?>">
                  </div>
                  <div class="ua-form-field">
                    <label>الصلاحية</label>
                    <input class="form-control ua-form-control" value="تُعيَّن من النسخة الأساسية فقط" readonly>
                  </div>
                </div>
              </div>
            </div>
            <?php endif; ?>
          </div>

          <div class="ua-form-preview ua-edit-preview">
            <div class="ua-form-card">
              <div class="ua-form-card-head"><h3>معاينة الحساب</h3></div>
              <div class="ua-form-card-body">
                <div class="ua-form-kpi">
                  <div class="ua-form-kpi-title">اسم المستخدم</div>
                  <div class="ua-form-kpi-value" id="editUsernamePreview"><?= h($row['username'] ?? '—') ?></div>
                </div>
                <div class="ua-form-kpi mt-2">
                  <div class="ua-form-kpi-title">حساب PPPoE</div>
                  <div class="ua-form-kpi-value" id="editPppPreview"><?= h($row['ppp_username'] ?? $row['username'] ?? '—') ?></div>
                </div>
                <div class="ua-form-kpi mt-2">
                  <div class="ua-form-kpi-title">كلمة مرور PPPoE</div>
                  <div class="ua-form-kpi-value" id="editPassPreview"><?= h($row['ppp_password'] ?? $row['password_plain'] ?? '—') ?></div>
                </div>
              </div>
            </div>

            <div class="ua-form-card">
              <div class="ua-form-card-head"><h3>ملخص الخدمة و MikroTik</h3></div>
              <div class="ua-form-card-body">
                <div class="ua-form-summary">
                  <ul>
                    <li>السرعة: <strong id="editSpeedPreview"><?= h(se_row_text($row,'speed_name') ?: '—') ?></strong></li>
                    <li>الباقة: <strong id="editPackagePreview"><?= h(se_row_text($row,'package_name') ?: '—') ?></strong></li>
                    <li>PPPoE Profile: <strong id="editProfilePreview"><?= h(se_old_profile($row) ?: '—') ?></strong></li>
                    <li>Rate-Limit: <strong id="editRatePreview"><?= h(se_old_rate($row) ?: '—') ?></strong></li>
                    <li>نوع IP: <strong id="editIpTypePreview"><?= h(se_row_text($row,'ip_address') ? 'IP ثابت' : 'IP ديناميكي') ?></strong></li>
                    <li>من الـ Pool: <strong id="editPoolPreview"><?= h(se_row_text($row,'ip_address') ? 'لا' : 'نعم') ?></strong></li>
                    <li>الحجز: <strong id="editIpPreview" dir="ltr"><?= h(se_row_text($row,'ip_address') ?: 'مفتوح / غير محدد') ?></strong></li>
                  </ul>
                </div>
              </div>
            </div>

            <div class="ua-edit-action-panel" aria-label="إجراءات تعديل المشترك">
              <?php $stagedAccountStatus = subs_policy_staged_account_status($conn, $row); ?>
              <?php if(!empty($stagedAccountStatus['stale'])): ?><div class="alert alert-warning mb-2 w-100"><i class="fa fa-exclamation-triangle" aria-hidden="true"></i> <?= h((string)$stagedAccountStatus['message']) ?></div><?php endif; ?>
              <button type="submit" class="ua-edit-submit ua-edit-submit-save" name="save" id="saveSubscriberBtn" value="1">
                <i class="fa fa-save" aria-hidden="true"></i><span>حفظ التعديل</span>
              </button>
              <button type="submit" class="ua-edit-submit ua-edit-submit-encrypt ua-edit-submit-stage" name="stage_encrypt_account" id="stageEncryptAccountBtn" value="1">
                <i class="fa fa-key" aria-hidden="true"></i><span>تجهيز الحساب المشفر</span>
              </button>
              <?php if(!empty($stagedAccountStatus['ready'])): ?>
              <button type="submit" class="ua-edit-submit ua-edit-submit-encrypt ua-edit-submit-apply" name="apply_encrypt_account" id="applyEncryptAccountBtn" value="1">
                <i class="fa fa-bolt" aria-hidden="true"></i><span>تشفير الآن</span>
              </button>
              <a class="ua-edit-submit ua-edit-submit-print ua-edit-submit-print-encrypted" href="subscriber_info_print.php?subscriber_id=<?= (int)$id ?>&amp;credentials=encrypted" data-subscriber-info-print>
                <i class="fa fa-print" aria-hidden="true"></i><span>طباعة البيانات المشفرة</span>
              </a>
              <?php endif; ?>
              <a class="ua-edit-submit ua-edit-submit-print ua-edit-submit-print-current"
                 href="subscriber_info_print.php?subscriber_id=<?= (int)$id ?><?= $uaAgentEditContext ? '&amp;agent=' . (int)$uaAgentEditId . '&amp;agent_edit_token=' . rawurlencode($uaAgentEditToken) : '' ?>"
                 data-subscriber-info-print
                 data-subscriber-id="<?= (int)$id ?>"
                 data-agent="<?= $uaAgentEditContext ? (int)$uaAgentEditId : 0 ?>"
                 data-edit-token="<?= h($uaAgentEditContext ? $uaAgentEditToken : '') ?>">
                <i class="fa fa-print" aria-hidden="true"></i><span>طباعة معلومات المشترك</span>
              </a>
            </div>
          </div>
        </div>
      </form>
    </div>
  </section>
</div>




<script>
(function(){
  'use strict';
  const form = document.getElementById('subscriberEditForm');
  if(!form) return;

  const original = {
    username: <?= json_encode(se_trim($row['username'] ?? ''), JSON_UNESCAPED_UNICODE) ?>,
    password_plain: <?= json_encode(se_trim($row['password_plain'] ?? ''), JSON_UNESCAPED_UNICODE) ?>,
    ppp_username: <?= json_encode(se_old_ppp_user($row), JSON_UNESCAPED_UNICODE) ?>,
    ppp_password: <?= json_encode(se_old_ppp_pass($row), JSON_UNESCAPED_UNICODE) ?>,
    ppp_profile: <?= json_encode(se_old_profile($row), JSON_UNESCAPED_UNICODE) ?>,
    ppp_rate_limit: <?= json_encode(se_old_rate($row), JSON_UNESCAPED_UNICODE) ?>,
    speed_name: <?= json_encode(se_trim($row['speed_name'] ?? ''), JSON_UNESCAPED_UNICODE) ?>,
    package_name: <?= json_encode(se_trim($row['package_name'] ?? ''), JSON_UNESCAPED_UNICODE) ?>,
    ip_address: <?= json_encode(subs_static_ip_normalize((string)($row['ip_address'] ?? '')), JSON_UNESCAPED_UNICODE) ?>
  };

  const $ = id => document.getElementById(id);
  const plainPass = $('plainPassword');
  const pppPass = $('pppPassword');
  const pppAuto = $('pppAuto');
  const mtConfirmed = $('mtConfirmed');
  const staticIp = $('staticIp');
  const staticIpHint = $('staticIpHint');
  const suggestStaticIpBtn = $('suggestStaticIpBtn');
  const fullNameHidden = $('fullNameHidden');
  const subscriberSerial = $('subscriberSerial');
  function subscriberSerialProblem(){
    if(!subscriberSerial) return '';
    const value = String(subscriberSerial.value || '').trim();
    const currentId = String(subscriberSerial.dataset.currentId || '');
    const prefix = String(subscriberSerial.dataset.seriesPrefix || '');
    const minLength = Math.max(1, parseInt(subscriberSerial.dataset.minLength || '6', 10) || 6);
    if(!/^\d+$/.test(value)) return 'الرقم التسلسلي يجب أن يتكون من أرقام فقط.';
    if(value === currentId) return '';
    if(value.length < minLength) return 'الرقم التسلسلي يجب ألا يقل عن ' + minLength + ' خانات.';
    if(prefix && !value.startsWith(prefix)) return 'الرقم الجديد يجب أن يبقى ضمن السلسلة ' + prefix + '.';
    const numeric = Number(value);
    if(!Number.isSafeInteger(numeric) || numeric <= 0 || numeric > 2147483647) return 'الرقم التسلسلي خارج المجال المسموح.';
    return '';
  }
  function validateSubscriberSerial(showMessage){
    if(!subscriberSerial) return true;
    const problem = subscriberSerialProblem();
    subscriberSerial.setCustomValidity(problem);
    if(problem && showMessage) subscriberSerial.reportValidity();
    return problem === '';
  }
  if(subscriberSerial){
    subscriberSerial.addEventListener('input', function(){ validateSubscriberSerial(false); });
    subscriberSerial.addEventListener('blur', function(){ validateSubscriberSerial(false); });
  }
  function refreshFullNameHidden(){
    if(!fullNameHidden) return;
    const parts = Array.from(document.querySelectorAll('.js-name-part')).map(el => String(el.value || '').trim()).filter(Boolean);
    if(parts.length) fullNameHidden.value = parts.join(' ');
  }
  document.querySelectorAll('.js-name-part').forEach(el => el.addEventListener('input', refreshFullNameHidden));
  refreshFullNameHidden();
  let pppPassTouched = false;
  let submittingAfterConfirm = false;

  function refreshPppToggleState(){
    const state = document.querySelector('.se-ppp-toggle-state');
    if(state && pppAuto) state.textContent = pppAuto.checked ? (state.dataset.on || 'مفعل') : (state.dataset.off || 'متوقف');
  }
  if(pppAuto){
    pppAuto.addEventListener('change', refreshPppToggleState);
    refreshPppToggleState();
  }

  if(pppPass){
    pppPass.addEventListener('input', function(){
      pppPassTouched = true;
      if(plainPass) plainPass.value = pppPass.value;
    });
  }

  function val(id){ const el=$(id); return el ? String(el.value || '').trim() : ''; }
  function ipv4Problem(ip){
    ip = String(ip || '').trim();
    if(!ip) return '';
    if(!/^(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}$/.test(ip)) return 'صيغة IP غير صحيحة. مثال صحيح: 10.10.10.77';
    const p = ip.split('.').map(x=>parseInt(x,10));
    if(ip === '0.0.0.0' || ip === '255.255.255.255') return 'لا يمكن استخدام هذا العنوان للمشترك.';
    if(p[0] === 127) return 'لا يمكن استخدام عناوين 127.x.x.x.';
    if(p[0] === 169 && p[1] === 254) return 'لا يمكن استخدام عناوين 169.254.x.x.';
    if(p[0] >= 224) return 'لا يمكن استخدام عناوين multicast/reserved.';
    if(p[3] === 0 || p[3] === 255) return 'لا تستخدم عنوان ينتهي بـ .0 أو .255.';
    return '';
  }
  function effectivePppPass(){
    return val('pppPassword') || val('plainPassword');
  }
  function profileFromSpeed(speed, pkg, fallback){
    fallback = String(fallback || '').trim();
    const m = String(speed || '').match(/(\d{1,3})\s*M/i) || String(speed || '').match(/^(\d{1,3})$/) || String(pkg || '').match(/(\d{1,3})\s*M/i);
    if(m && parseInt(m[1],10)>0) return 'PPPOE-' + parseInt(m[1],10) + 'M';
    return fallback || 'pppoe-profile';
  }
  function mtChangeList(){
    if(!pppAuto || !pppAuto.checked) return [];
    const out=[];
    const pppUser = val('pppUsername') || val('editUsername');
    const pppPassword = effectivePppPass();
    const speed = val('speedName');
    const pkg = val('packageName');
    const profile = profileFromSpeed(speed, pkg, val('pppProfile'));
    const rate = val('pppRate');
    if(pppUser !== String(original.ppp_username || '')) out.push('اسم حساب PPPoE');
    if(pppPassword && pppPassword !== String(original.ppp_password || '')) out.push('كلمة مرور PPPoE');
    if(profile && profile !== String(original.ppp_profile || '')) out.push('بروفايل PPPoE');
    if(rate !== String(original.ppp_rate_limit || '')) out.push('Rate-Limit');
    const ip = val('staticIp');
    if(ip !== String(original.ip_address || '')) out.push(ip ? ('تثبيت IP ثابت: ' + ip) : 'إلغاء تثبيت IP الثابت');
    return out;
  }
  function popup(title, html, options){
    options = options || {};
    const infoOnly = !!options.infoOnly;
    if(window.uaDialog){
      return window.uaDialog({
        title:title || (infoOnly ? 'معلومة' : 'تأكيد العملية'),
        html:String(html||''),
        kind:infoOnly ? 'alert' : 'confirm',
        showCancel:!infoOnly,
        confirmText:infoOnly ? (options.closeText || 'إغلاق') : 'تأكيد وتنفيذ',
        cancelText:'إلغاء',
        icon:infoOnly ? (options.icon || 'fa-info-circle') : 'fa-shield'
      });
    }
    return new Promise(resolve=>{
      const old=document.getElementById('seMtConfirm'); if(old) old.remove();
      const b=document.createElement('div');
      b.id='seMtConfirm';
      b.className='se-mt-confirm-backdrop';
      const iconClass = infoOnly ? (options.icon || 'fa-info-circle') : 'fa-shield';
      const okText = infoOnly ? (options.closeText || 'إغلاق') : 'تأكيد وتنفيذ';
      b.innerHTML='<div class="se-mt-confirm-card">'+
        '<div class="se-mt-confirm-icon"><i class="fa '+iconClass+'"></i></div>'+
        '<div class="se-mt-confirm-title">'+title+'</div>'+
        '<div class="se-mt-confirm-body">'+html+'</div>'+
        '<div class="se-mt-confirm-actions">'+
        '<button type="button" id="seMtOk" class="se-mt-confirm-ok">'+okText+'</button>'+
        (infoOnly ? '' : '<button type="button" id="seMtCancel" class="se-mt-confirm-cancel">إلغاء</button>')+
        '</div></div>';
      document.body.appendChild(b);
      const done=v=>{b.remove();resolve(v)};
      document.getElementById('seMtOk').onclick=()=>done(true);
      const cancelBtn = document.getElementById('seMtCancel');
      if(cancelBtn) cancelBtn.onclick=()=>done(false);
      b.onclick=e=>{if(e.target===b)done(infoOnly ? true : false)};
    });
  }

  function htmlEscape(x){
    return String(x == null ? '' : x).replace(/[&<>"']/g, m=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#039;'}[m]));
  }
  function setIpHint(text, kind){
    if(!staticIpHint) return;
    staticIpHint.classList.remove('se-hint-ok','se-hint-warn','se-hint-error');
    if(kind) staticIpHint.classList.add('se-hint-' + kind);
    staticIpHint.textContent = text;
  }
  function currentSuggestProfile(){
    return profileFromSpeed(val('speedName'), val('packageName'), val('pppProfile'));
  }
  async function suggestStaticIp(){
    if(!suggestStaticIpBtn || !staticIp) return;

    if(staticIp.value.trim() && staticIp.value.trim() !== String(original.ip_address || '')){
      const replace = await popup('استبدال IP الموجود؟', 'يوجد IP مكتوب حالياً في الحقل:<br><b dir="ltr" class="se-mt-accent">' + htmlEscape(staticIp.value.trim()) + '</b><br>هل تريد استبداله باقتراح جديد من MikroTik؟');
      if(!replace) return;
    }

    const oldHtml = suggestStaticIpBtn.innerHTML;
    suggestStaticIpBtn.disabled = true;
    suggestStaticIpBtn.innerHTML = '<i class="fa fa-spinner fa-spin"></i>';
    setIpHint('جاري فحص MikroTik واقتراح IP متاح...', 'warn');

    try{
      const params = new URLSearchParams();
      params.set('id', <?= (int)$id ?>);
      params.set('ppp_user', val('pppUsername') || val('editUsername'));
      params.set('profile', currentSuggestProfile());
      params.set('_', Date.now());

      const res = await fetch('api/subscriber_static_ip_suggest.php?' + params.toString(), {
        method: 'GET',
        credentials: 'same-origin',
        headers: {'Accept':'application/json'}
      });
      const data = await res.json().catch(()=>null);
      if(!data || !data.ok || !data.ip){
        const msg = data && data.message ? data.message : 'تعذر اقتراح IP من MikroTik.';
        setIpHint(msg, 'error');
        await popup('تعذر اقتراح IP', htmlEscape(msg));
        return;
      }

      staticIp.value = data.ip;
      staticIp.dispatchEvent(new Event('input', {bubbles:true}));
      setIpHint('تم اقتراح IP متاح حالياً من MikroTik: ' + data.ip + ' — يمكنك تعديله يدوياً قبل الحفظ.', 'ok');

      const warnings = Array.isArray(data.warnings) ? data.warnings.filter(Boolean) : [];
      if(warnings.length){
        const html = '<div>تم وضع الاقتراح في الحقل:</div>'+
          '<div dir="ltr" class="se-mt-accent-ip">' + htmlEscape(data.ip) + '</div>'+
          '<div class="se-mt-accent">ملاحظة:</div>'+
          '<ul class="se-mt-list">' + warnings.map(w=>'<li>'+htmlEscape(w)+'</li>').join('') + '</ul>'+
          '<div class="se-mt-note">الاقتراح غير إلزامي، ويمكنك تعديله قبل الضغط على حفظ.</div>';
        await popup('اقتراح IP ثابت', html);
      }
    } catch(ex){
      const msg = ex && ex.message ? ex.message : 'حدث خطأ أثناء اقتراح IP.';
      setIpHint(msg, 'error');
      await popup('تعذر اقتراح IP', htmlEscape(msg));
    } finally {
      suggestStaticIpBtn.disabled = false;
      suggestStaticIpBtn.innerHTML = oldHtml;
    }
  }

  if(suggestStaticIpBtn){
    suggestStaticIpBtn.addEventListener('click', suggestStaticIp);
  }

  const staticIpHelpBtn = $('staticIpHelpBtn');
  if(staticIpHelpBtn){
    staticIpHelpBtn.addEventListener('click', function(){
      popup('معلومة IP الثابت', 'عند وضع IP صحيح يتم تثبيته على MikroTik كـ remote-address.<br>زر الاقتراح يملأ الحقل فقط ويمكنك تعديله قبل الضغط على حفظ.', {infoOnly:true, closeText:'إغلاق', icon:'fa-info-circle'});
    });
  }

  function setText(id, value, fallback){
    const el = $(id);
    if(el) el.textContent = (value && String(value).trim()) ? String(value).trim() : (fallback || '—');
  }
  function syncEditPreview(){
    setText('editUsernamePreview', val('editUsername'));
    setText('editPppPreview', val('pppUsername'));
    setText('editPassPreview', val('pppPassword'));
    setText('editSpeedPreview', val('speedName'));
    setText('editPackagePreview', val('packageName'));
    setText('editProfilePreview', val('pppProfile'));
    setText('editRatePreview', val('pppRate'));
    const ipValue = val('staticIp');
    setText('editIpPreview', ipValue, 'مفتوح / غير محدد');
    setText('editIpTypePreview', ipValue ? 'IP ثابت' : 'IP ديناميكي');
    setText('editPoolPreview', ipValue ? 'لا' : 'نعم');
  }
  ['editUsername','pppUsername','pppPassword','speedName','packageName','pppProfile','pppRate','staticIp'].forEach(function(id){
    const el = $(id);
    if(el) ['input','change'].forEach(ev => el.addEventListener(ev, syncEditPreview));
  });
  syncEditPreview();

  form.addEventListener('submit', async function(e){
    const submitter = e.submitter;
    if(submitter && submitter.id === 'saveSubscriberBtn' && !validateSubscriberSerial(true)){
      e.preventDefault();
      return;
    }
    if(submitter && submitter.id === 'stageEncryptAccountBtn'){
      if(submittingAfterConfirm) return;
      e.preventDefault();
      const ok = await popup('تجهيز الحساب المشفر', 'سيتم توليد بيانات الحساب المشفر وحفظها في قاعدة البيانات فقط دون تعديل MikroTik أو حذف الحساب الحالي.');
      if(!ok) return;
      submittingAfterConfirm = true;
      submitter.click();
      return;
    }

    if(submitter && submitter.id === 'applyEncryptAccountBtn'){
      if(submittingAfterConfirm) return;
      e.preventDefault();
      const ok = await popup('تشفير الآن', 'سيتم إنشاء الحساب المجهز على MikroTik ثم استبدال الحساب الحالي وحذف القديم بعد نجاح الحساب الجديد.');
      if(!ok) return;
      submittingAfterConfirm = true;
      submitter.click();
      return;
    }

    if(submitter && submitter.id === 'saveSubscriberBtn'){
      if(submittingAfterConfirm) return;
      const ipProblem = ipv4Problem(val('staticIp'));
      if(ipProblem){
        e.preventDefault();
        await popup('IP غير صحيح', ipProblem);
        return;
      }
      const changes = mtChangeList();
      if(changes.length){
        e.preventDefault();
        const list = '<ul class="se-mt-list-changes">' + changes.map(x=>'<li>'+htmlEscape(x)+'</li>').join('') + '</ul>';
        const ok = await popup('تأكيد تعديل حساب MikroTik', 'سيتم تحديث بيانات الحساب على MikroTik بعد الحفظ:' + list + '<div class="se-mt-note-accent">لن يتم اعتماد التعديل إذا فشل الاتصال أو رفض MikroTik العملية.</div>');
        if(!ok) return;
        if(mtConfirmed) mtConfirmed.value='1';
        submittingAfterConfirm = true;
        submitter.click();
      }
    }
  }, true);
})();
</script>
<?php if($serialChangedFrom > 0): ?>
<script>
if (window.history && window.history.replaceState) {
  const nextUrl = new URL(window.location.href);
  nextUrl.searchParams.set('id', <?= (int)$id ?>);
  window.history.replaceState({}, '', nextUrl.pathname + nextUrl.search + nextUrl.hash);
}
</script>
<?php endif; ?>

<?php if($uaAgentEditContext):
$agentEditOutputFileRoute = [
  'commandKey'=>'contract_print',
  'scopeBase'=>ua_output_agent_scope($uaAgentEditId),
  'configUrl'=>'output_route_config.php',
  'fileProxyUrl'=>'output_file_proxy.php',
  'logUrl'=>'output_job_log.php',
  'contractLogUrl'=>'contract_print_log.php',
  'csrfToken'=>ua_csrf_token(),
];
?>
<script>window.UA_OUTPUT_FILE_ROUTE=<?= json_encode($agentEditOutputFileRoute, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES) ?>;</script>
<script src="assets/js/ua_output_file_router.js?v=<?= (int)(@filemtime(__DIR__ . '/assets/js/ua_output_file_router.js') ?: 1) ?>"></script>
<?php endif; ?>
<script src="assets/js/subscriber_info_print_launcher.js?v=<?= (int)(@filemtime(__DIR__ . '/assets/js/subscriber_info_print_launcher.js') ?: 1) ?>"></script>
<?php include __DIR__ . '/footer.php'; ?>
