<?php
// admin/subscribers_restore.php (Restore from archive)
// - Restores subscriber record (is_deleted=0)
// - Ensures PPP secret exists on MikroTik (add/enable)

if (session_status() === PHP_SESSION_NONE) session_start();

require_once __DIR__ . '/helpers.php';
require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/db_bootstrap.php';
require_once __DIR__ . '/mikrotik_lib.php';
require_once __DIR__ . '/super_admin_guard.php';

require_login('index.php?login=1');
if (function_exists('require_perm')) require_perm('can_manage_subscribers');

// حماية الاستعادة بكلمة مرور السوبر أدمن (مثل إلغاء الاشتراك)
require_super_admin_confirmation('استعادة مشترك من الأرشيف');

if (function_exists('ensure_db')) ensure_db(true);
$conn = $GLOBALS['conn'] ?? null;
if(!$conn){ $_SESSION['flash_err']='DB connection failed'; header('Location: subscribers_archive.php'); exit; }

$id = (int)($_GET['id'] ?? 0);
if($id<=0){ $_SESSION['flash_err']='ID غير صالح'; header('Location: subscribers_archive.php'); exit; }

// جلب بيانات المشترك قبل الاستعادة (لنستخدمها لإرجاعه للمايكروتك)
$res = $conn->query("SELECT * FROM subscribers WHERE id=$id LIMIT 1");
if(!$res || !$res->num_rows){ $_SESSION['flash_err']='المشترك غير موجود'; header('Location: subscribers_archive.php'); exit; }
$sub = $res->fetch_assoc();
$mode = trim((string)($_GET['mode'] ?? 'keep'));
if (!in_array($mode, ['keep','clean'], true)) $mode = 'keep';

if ($mode === 'clean') {
  $u = $conn->real_escape_string(trim((string)($sub['ppp_username'] ?? '')) ?: trim((string)($sub['username'] ?? '')));
  if (table_exists($conn, 'subscriber_activity_log') && col_exists($conn, 'subscriber_activity_log', 'subscriber_id')) { @ $conn->query("DELETE FROM subscriber_activity_log WHERE subscriber_id=$id"); }
  if (table_exists($conn, 'payments') && col_exists($conn, 'payments', 'subscriber_id')) { @ $conn->query("DELETE FROM payments WHERE subscriber_id=$id"); }
  if (table_exists($conn, 'invoices') && col_exists($conn, 'invoices', 'subscriber_id')) { @ $conn->query("DELETE FROM invoices WHERE subscriber_id=$id"); }
  if (table_exists($conn, 'ppp_usage_monthly')) {
    if (col_exists($conn, 'ppp_usage_monthly', 'subscriber_id')) { @ $conn->query("DELETE FROM ppp_usage_monthly WHERE subscriber_id=$id"); }
    if ($u !== '' && col_exists($conn, 'ppp_usage_monthly', 'username')) { @ $conn->query("DELETE FROM ppp_usage_monthly WHERE username='$u'"); }
  }
  $reset = [];
  foreach (['registered_at','first_activated_at','last_seen_at','last_disconnect_at','deleted_at','ppp_last_cut_at'] as $c) if (col_exists($conn,'subscribers',$c)) $reset[] = "$c=NULL";
  foreach (['is_online','mt_disabled','ppp_is_disabled','is_cut'] as $c) if (col_exists($conn,'subscribers',$c)) $reset[] = "$c=0";
  if (!empty($reset)) @ $conn->query("UPDATE subscribers SET " . implode(',', $reset) . " WHERE id=$id");
}

// استعادة من الأرشيف داخل النظام
$ok = $conn->query("UPDATE subscribers SET is_deleted=0, deleted_at=NULL WHERE id=$id");

// محاولة إرجاعه للمايكروتك (PPP Secret)
$mkOk = null;
$mkMsg = '';

$pppUser = trim((string)($sub['ppp_username'] ?? ''));
if($pppUser==='') $pppUser = trim((string)($sub['username'] ?? ''));

$pppPass = trim((string)($sub['ppp_password'] ?? ''));
if($pppPass==='') $pppPass = trim((string)($sub['password_plain'] ?? ''));

$pppProfile = trim((string)($sub['ppp_profile'] ?? ''));
if($pppProfile==='') $pppProfile = trim((string)($sub['mt_profile'] ?? ''));

$pppRate = trim((string)($sub['ppp_rate_limit'] ?? ''));
if($pppRate==='') $pppRate = trim((string)($sub['mt_rate_limit'] ?? ''));

$comment = trim((string)($sub['mt_comment'] ?? ''));
if($comment===''){
  $comment = trim((string)($sub['full_name'] ?? ''));
}

if($ok){
  // فقط إذا لدينا اسم PPP
  if($pppUser !== ''){
    $api = mt_api_connect();

    if($api){
      $callComm = function_exists('method_exists') && method_exists($api,'comm');
      $callCmd  = function_exists('method_exists') && method_exists($api,'command');

      // Wrapper متوافق مع نوعين من مكتبات API
      $cmd = function($path, $params=[]) use ($api,$callComm,$callCmd){
        if($callCmd){
          $arr = [$path];
          foreach($params as $k=>$v){
            if($k === '.id') { $arr[] = '=.id='.$v; continue; }
            if(strlen($k) && $k[0] === '?'){ $arr[] = $k.'='.$v; continue; } // فلترة مثل ?name=
            $arr[] = '='.$k.'='.$v;
          }
          return $api->command($arr);
        }
        if($callComm){
          return $api->comm($path, $params);
        }
        return null;
      };

      try{
        // ابحث عن السر (secret)
        $foundId = null;
        $foundDisabled = null;

        // جرّب فلتر ?name= أولاً (إذا المكتبة تدعمه)
        $secrets = null;
        try{
          $secrets = $cmd('/ppp/secret/print', ['?name'=>$pppUser]);
        }catch(Exception $e){
          $secrets = null;
        }
        // fallback: اطبع ثم فلتر محلياً
        if(!is_array($secrets)){
          $secrets = $cmd('/ppp/secret/print', []);
        }

        if(is_array($secrets)){
          foreach($secrets as $s){
            if(($s['name'] ?? '') === $pppUser && isset($s['.id'])){
              $foundId = $s['.id'];
              $foundDisabled = $s['disabled'] ?? null;
              break;
            }
          }
        }

        // دالة تحويل disabled لمعيار واحد
        $isDisabled = function($v){
          if($v === null) return false;
          $v = strtolower(trim((string)$v));
          return ($v === 'yes' || $v === 'true' || $v === '1' || $v === 'on');
        };

        if($foundId){
          // موجود: فعّل إذا كان disabled
          if($isDisabled($foundDisabled)){
            $cmd('/ppp/secret/enable', ['.id'=>$foundId]);
            $mkOk = true;
            $mkMsg = '✅ تم تفعيل الحساب على المايكروتك';
          } else {
            $mkOk = true;
            $mkMsg = 'ℹ️ الحساب موجود بالفعل على المايكروتك';
          }
        } else {
          // غير موجود: أضفه من بيانات قاعدة البيانات
          if($pppPass === ''){
            $mkOk = false;
            $mkMsg = '⚠️ تم استعادة المشترك للنظام لكن لا يوجد كلمة مرور PPP لإعادته للمايكروتك.';
          } else {
            $params = [
              'name' => $pppUser,
              'password' => $pppPass,
              'service' => 'pppoe',
            ];
            if($pppProfile !== '') $params['profile'] = $pppProfile;
            if($pppRate !== '') $params['rate-limit'] = $pppRate;
            if($comment !== '') $params['comment'] = $comment;

            $cmd('/ppp/secret/add', $params);
            $mkOk = true;
            $mkMsg = '✅ تم إعادة إضافة الحساب للمايكروتك';
          }
        }

      }catch(Exception $e){
        $mkOk = false;
        $mkMsg = '⚠️ استعادة النظام تمت لكن فشل اتصال/تنفيذ المايكروتك: '.$e->getMessage();
      }

    } else {
      $mkOk = false;
      $mkMsg = '⚠️ استعادة النظام تمت لكن تعذر الاتصال بالمايكروتك.';
    }
  } else {
    $mkOk = false;
    $mkMsg = '⚠️ استعادة النظام تمت لكن اسم PPP غير موجود للمشترك.';
  }

  @audit_log($conn, 'SUBSCRIBER_RESTORE', 'subscribers', $id, 'ppp_user='.$pppUser.'; mode='.$mode.'; mk_msg='.$mkMsg);
  $_SESSION['flash_ok'] = '✅ تم استعادة المشترك من الأرشيف' . ($mode === 'clean' ? ' بدون السجل السابق' : ' مع السجل السابق') . ($mkMsg ? '<br>'.$mkMsg : '');
} else {
  $_SESSION['flash_err'] = '❌ فشلت الاستعادة: '.($conn->error ?? '');
}

header('Location: subscribers_archive.php');
exit;
