<?php
if (!defined('ALLOW_MANUAL_PPP_CUT_EXECUTION')) define('ALLOW_MANUAL_PPP_CUT_EXECUTION', true);
@ini_set('display_errors','0');
@ini_set('max_execution_time','25');
@set_time_limit(25);
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
if (session_status() === PHP_SESSION_NONE) session_start();
header('Content-Type: application/json; charset=utf-8');

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__ . '/../subscriber_history_lib.php';
require_once __DIR__ . '/../ppp_active_cache_lib.php';
require_once __DIR__ . '/../super_admin_guard.php';
require_once __DIR__ . '/../subscribers_bulk_action_lib.php';

require_login('index.php?login=1');
if (function_exists('require_perm')) @require_perm('can_manage_subscribers');
if (!function_exists('super_admin_ok') || !super_admin_ok('api/subscribers_bulk_action.php')) {
  http_response_code(403);
  echo json_encode(['ok'=>false,'message'=>'انتهت جلسة الحماية أو لم يتم التحقق من كلمة مرور السوبر أدمن.'], JSON_UNESCAPED_UNICODE);
  exit;
}
if (function_exists('ensure_db')) ensure_db(true);

$conn = $GLOBALS['conn'] ?? null;
if (!($conn instanceof mysqli)) {
  http_response_code(500);
  echo json_encode(['ok'=>false,'message'=>'Database connection error'], JSON_UNESCAPED_UNICODE);
  exit;
}

function bulk_json_out(array $arr, int $code = 200): void {
  http_response_code($code);
  echo json_encode($arr, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
  exit;
}

$action = strtolower(trim((string)($_POST['action'] ?? '')));
$ids = bulk_pending_clean_ids($_POST['ids'] ?? []);

if (!$ids || !bulk_action_allowed($action)) bulk_json_out(['ok'=>false,'message'=>'طلب غير صالح'], 400);
if (count($ids) > 300) bulk_json_out(['ok'=>false,'message'=>'عدد المشتركين كبير جداً للعملية الواحدة. نفّذ على دفعات أقل من 300.'], 400);

try {
  mt_require_router_online_or_throw($conn, 'تنفيذ جماعي للمشتركين');
} catch (Throwable $e) {
  bulk_log('router offline: '.$e->getMessage());
  bulk_json_out(['ok'=>false,'message'=>$e->getMessage()], 409);
}

try {
  $result = bulk_execute_actions($conn, $action, $ids, [
    'source' => 'api',
    'router_checked' => true,
    'max_ids' => 300,
    'max_errors' => 8,
    'refresh_cache' => true,
    'message_prefix' => 'تم تنفيذ ',
  ]);
  bulk_json_out([
    'ok' => (bool)($result['ok'] ?? false),
    'message' => (string)($result['message'] ?? 'تم التنفيذ'),
    'changed' => (int)($result['changed'] ?? 0),
    'failed' => (int)($result['failed'] ?? 0),
    'details' => (array)($result['details'] ?? []),
  ], 200);
} catch (Throwable $e) {
  bulk_log('fatal action='.$action.' ids='.implode(',', $ids).' error='.$e->getMessage());
  bulk_json_out(['ok'=>false,'message'=>'فشل التنفيذ: '.$e->getMessage()], 500);
}
