<?php
/**
 * super_admin_guard.php
 *
 * حماية السوبر أدمن للأزرار الحساسة.
 * - يطلب كلمة المرور في كل مرة.
 * - السماح صالح لمرة واحدة فقط للرابط المحدد.
 */

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

require_once __DIR__ . '/auth.php';

function super_admin_sanitize_go(string $go): string {
  $go = trim((string)$go);
  if ($go === '') return '';

  for ($i = 0; $i < 2; $i++) {
    if (strpos($go, '%') === false) break;
    $dec = urldecode($go);
    if ($dec === $go) break;
    $go = $dec;
  }

  if (preg_match('#^(https?:)?//#i', $go)) return '';
  if (str_starts_with($go, '\\') || str_starts_with($go, '/')) return '';

  return $go;
}

function current_relative_url(): string {
  $self = basename($_SERVER['PHP_SELF'] ?? '');
  $qs   = $_SERVER['QUERY_STRING'] ?? '';
  return $qs ? ($self . '?' . $qs) : $self;
}

function super_admin_mark_ok(?string $go = null): void {
  $go = super_admin_sanitize_go((string)$go);
  if ($go === '') return;
  $_SESSION['super_admin_single_use_go'] = $go;
  $_SESSION['super_admin_ok_until'] = time() + 600;
}

function super_admin_normalize_modal_go(string $go): string {
  $go = super_admin_sanitize_go($go);
  if ($go === '') return '';

  $parts = parse_url($go);
  $path = basename((string)($parts['path'] ?? $go));
  $query = [];
  if (!empty($parts['query'])) {
    parse_str((string)$parts['query'], $query);
  }

  // روابط النوافذ داخل صفحة المشتركين تضيف هذه المتغيرات للعرض فقط.
  // لا يجوز أن تكسر صلاحية التحقق بالسوبر أدمن.
  unset($query['embed'], $query['ua_modal'], $query['ua_sub_modal'], $query['ua_subscriber_modal'], $query['subscriber_modal'], $query['modal'], $query['_modal']);

  ksort($query);
  $qs = http_build_query($query);
  return $qs ? ($path . '?' . $qs) : $path;
}

function super_admin_peek_ok(?string $go = null): bool {
  $allowed = (string)($_SESSION['super_admin_single_use_go'] ?? '');
  $current = super_admin_sanitize_go($go ?? current_relative_url());
  if ($current === '') return false;

  if (super_admin_chain_session_ok($current)) return true;

  if ($allowed === '') return false;

  if (hash_equals($allowed, $current)) return true;

  // سماح آمن للفرق بين الرابط الأصلي ورابط العرض داخل modal فقط
  // مثل: subscribers_edit.php?id=5  مقابل  subscribers_edit.php?id=5&embed=1&ua_modal=1
  $a = super_admin_normalize_modal_go($allowed);
  $c = super_admin_normalize_modal_go($current);
  return ($a !== '' && $c !== '' && hash_equals($a, $c));
}

function super_admin_chain_session_ok(string $go): bool {
  $until = (int)($_SESSION['super_admin_ok_until'] ?? 0);
  if ($until < time()) return false;
  if (!super_admin_is_modal_or_ajax_request()) return false;

  $normalized = super_admin_normalize_modal_go($go);
  $file = strtolower(basename((string)(parse_url($normalized, PHP_URL_PATH) ?: $normalized)));
  $protected = [
    'subscribers_view.php' => true,
    'subscribers_edit.php' => true,
    'subscribers_distribution.php' => true,
    'subscribers_history.php' => true,
    'subscribers_history_clear.php' => true,
    'subscribers_cancel.php' => true,
    'subscribers_ppp_toggle.php' => true,
    'subscribers_restore.php' => true,
    'subscribers_speed_toggle_all.php' => true,
    'subscribers_speed_toggle_selected.php' => true,
  ];

  return isset($protected[$file]);
}

function super_admin_ok(?string $go = null): bool {
  if (!super_admin_peek_ok($go)) {
    return false;
  }

  unset($_SESSION['super_admin_single_use_go']);
  return true;
}

function super_admin_clear_ok(): void {
  unset($_SESSION['super_admin_single_use_go'], $_SESSION['super_admin_ok_until']);
}


function super_admin_is_modal_or_ajax_request(): bool {
  $xhr = strtolower((string)($_SERVER['HTTP_X_REQUESTED_WITH'] ?? '')) === 'xmlhttprequest';
  return $xhr || isset($_GET['embed']) || isset($_GET['ua_modal']) || isset($_GET['iframe']) || isset($_GET['ua_tab']);
}


function super_admin_style_asset_link(): string {
  $scriptDir = trim(str_replace('\\','/', dirname((string)($_SERVER['SCRIPT_NAME'] ?? ''))), '/');
  $prefix = (basename($scriptDir) === 'api') ? '../' : '';
  $cssFile = __DIR__ . '/assets/css/ua_program_unified.css';
  $v = @filemtime($cssFile) ?: 1;
  return '<link rel="stylesheet" href="' . $prefix . 'assets/css/ua_program_unified.css?v=' . (int)$v . '">' . super_admin_theme_inline_style();
}

function super_admin_theme_tokens(): array {
  try {
    require_once __DIR__ . '/ui_settings.php';
    require_once __DIR__ . '/theme_assets_lib.php';
    if (function_exists('ensure_db')) {
      ensure_db(false);
    }
    $conn = $GLOBALS['conn'] ?? null;
    $theme = 'armoury_dark';
    if ($conn instanceof mysqli && function_exists('ua_get_ui_setting')) {
      $theme = (string)ua_get_ui_setting($conn, 'ui_theme', 'armoury_dark');
    }
    $tokens = function_exists('ua_theme_design_tokens') ? ua_theme_design_tokens($theme) : [];
    $tokens['ui_theme'] = preg_replace('/[^a-z0-9_-]+/i', '-', $theme ?: 'armoury_dark');
    return $tokens;
  } catch (Throwable $e) {
    return ['ui_theme' => 'armoury_dark'];
  }
}

function super_admin_theme_body_class(): string {
  $tokens = super_admin_theme_tokens();
  $theme = (string)($tokens['ui_theme'] ?? 'armoury_dark');
  return 'ua-design-v2 ua-theme-' . $theme;
}

function super_admin_theme_inline_style(): string {
  $tokens = super_admin_theme_tokens();
  $map = [
    '--ua-accent' => 'ui_accent',
    '--ua-text' => 'ui_text_color',
    '--ua-border' => 'ui_border_color',
    '--ua-border-strong' => 'ui_border_color',
    '--ua-bg' => 'ui_body_bg',
    '--ua-theme-page-bg' => 'ui_body_bg',
    '--ua-theme-surface' => 'ui_surface_color',
    '--ua-theme-surface-2' => 'ui_surface_alt_color',
    '--ua-theme-input' => 'ui_input_color',
    '--ua-theme-input-text' => 'ui_input_text_color',
    '--ua-theme-modal' => 'ui_modal_color',
    '--ua-theme-security-alert' => 'ui_security_alert_color',
  ];
  $vars = [];
  foreach ($map as $cssVar => $tokenKey) {
    $value = trim((string)($tokens[$tokenKey] ?? ''));
    if ($value === '' || !preg_match('/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/', $value)) continue;
    $vars[] = $cssVar . ':' . $value;
  }
  if (!empty($tokens['ui_accent']) && preg_match('/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/', (string)$tokens['ui_accent'])) {
    $vars[] = '--ua-accent-2:color-mix(in srgb,' . (string)$tokens['ui_accent'] . ' 72%,white)';
  }
  if (empty($vars)) return '';
  $vars[] = '--ua-ds-text:var(--ua-text)';
  $vars[] = '--ua-ds-title:color-mix(in srgb,var(--ua-text) 92%,white 8%)';
  $vars[] = '--ua-ds-muted:color-mix(in srgb,var(--ua-text) 64%,transparent)';
  $vars[] = '--ua-ds-line:var(--ua-border)';
  return '<style>:root,.ua-super-admin-confirm-page{' . implode(';', $vars) . ';}</style>';
}

function super_admin_denied_response(string $go, string $action_label = 'عملية حساسة'): void {
  if (super_admin_is_modal_or_ajax_request()) {
    http_response_code(403);
    header('Content-Type: text/html; charset=utf-8');
    echo super_admin_style_asset_link();
    echo '<div class="ua-sa-denied-inline">';
    echo '<h3>هذه العملية تحتاج كلمة مرور السوبر أدمن</h3>';
    echo '<p>افتح العملية من زرها داخل قائمة المشتركين حتى تظهر نافذة الحماية المنبثقة. لن يتم فتح صفحة حماية مستقلة.</p>';
    echo '</div>';
    exit;
  }

  $file = strtolower(basename((string)(parse_url($go, PHP_URL_PATH) ?: $go)));
  if ($file === 'subscribers_distribution.php') {
    header('Location: super_admin_confirm.php?go=' . rawurlencode($go));
    exit;
  }
  if (str_starts_with($file, 'subscribers_') || $file === 'subscribers.php') {
    $_SESSION['flash_warning'] = 'هذه العملية محمية. افتحها من زرها داخل قائمة المشتركين حتى تظهر نافذة كلمة المرور.';
    header('Location: subscribers.php');
    exit;
  }

  http_response_code(403);
  header('Content-Type: text/html; charset=utf-8');
  echo '<!doctype html><html lang="ar" dir="rtl"><meta charset="utf-8"><title>عملية محمية</title>' . super_admin_style_asset_link() . '<body class="ua-sa-denied-page"><div class="ua-sa-denied-card"><h2>عملية محمية</h2><p>يرجى تنفيذ هذه العملية من داخل البرنامج لتظهر نافذة الحماية المنبثقة.</p><a href="dashboard.php">العودة</a></div></body></html>';
  exit;
}

function require_super_admin_confirmation(string $action_label = 'عملية حساسة', ?string $go = null): void {
  $go = super_admin_sanitize_go($go ?? current_relative_url());

  if ($go === '') {
    http_response_code(400);
    die('Bad request');
  }

  if (super_admin_ok($go)) {
    return;
  }

  super_admin_denied_response($go, $action_label);
}

$is_direct = isset($_SERVER['SCRIPT_FILENAME']) && realpath($_SERVER['SCRIPT_FILENAME']) === realpath(__FILE__);
if ($is_direct) {
  $go = super_admin_sanitize_go((string)($_GET['go'] ?? ''));

  if ($go === '') {
    http_response_code(400);
    die('Bad request');
  }

  if (super_admin_ok($go)) {
    header('Location: ' . $go);
    exit;
  }

  super_admin_denied_response($go, 'عملية محمية');
}
