<?php
$page_title = 'الطابعات والماسحات';
$UA_FORCE_DESIGN_V2 = true;
$isAndroid = ((string)($_GET['ua_android'] ?? '') === '1')
    || stripos((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 'NetworkCustomersAndroid/') !== false;
$UA_PAGE_CSS = $isAndroid
    ? ['assets/css/output_devices.css', 'assets/css/android_output_devices.css']
    : ['assets/css/output_devices.css'];

if (session_status() === PHP_SESSION_NONE) session_start();
require_once __DIR__ . '/helpers.php';
require_once __DIR__ . '/db_bootstrap.php';
require_once __DIR__ . '/auth.php';
require_once __DIR__ . '/output_devices_lib.php';

require_login();
if (function_exists('require_perm')) require_perm('can_settings');

$conn = $GLOBALS['conn'] ?? ensure_db(true);
if (!($conn instanceof mysqli)) die('قاعدة البيانات غير جاهزة.');
ua_output_ensure_schema($conn);

$requestedOutputScope = trim((string)($_POST['scope_key'] ?? $_GET['scope_key'] ?? ''));
$outputActor = ua_output_authorized_scope($conn, $requestedOutputScope);
if (empty($outputActor['authorized'])) {
    http_response_code(403);
    die('نطاق إعدادات الطباعة غير مسموح.');
}
$outputBaseScope = (string)($outputActor['base_scope'] ?? $outputActor['scope']);
$activeOutputScope = (string)$outputActor['scope'];
if (($_SERVER['REQUEST_METHOD'] ?? '') === 'GET' && $requestedOutputScope === '') {
    $baseScopeJson = json_encode($outputBaseScope, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
    echo '<!doctype html><html lang="ar" dir="rtl"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>تهيئة جهاز الطباعة</title></head><body><script>(function(){var k="ua_output_device_id_v1",v="";try{v=String(localStorage.getItem(k)||"").toLowerCase()}catch(e){}if(!/^[a-z0-9][a-z0-9_-]{7,63}$/.test(v)){v=(window.crypto&&window.crypto.randomUUID)?window.crypto.randomUUID().toLowerCase():"device-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,12);try{localStorage.setItem(k,v)}catch(e){}}var u=new URL(location.href);u.searchParams.set("scope_key",' . $baseScopeJson . '+":device:"+v);location.replace(u.toString())})();</script><noscript>يلزم تفعيل JavaScript لإعداد طابعات هذا الجهاز.</noscript></body></html>';
    exit;
}

$msg = '';
$err = '';
if (($_SERVER['REQUEST_METHOD'] ?? '') === 'POST' && (string)($_POST['action'] ?? '') === 'save_routes') {
    if (function_exists('ua_csrf_verify') && !ua_csrf_verify()) {
        $err = 'انتهت صلاحية النموذج. أعد فتح الصفحة وحاول مجدداً.';
    } else {
        try {
            $savedCount = ua_output_save_routes($conn, $_POST, (int)($_SESSION['admin_id'] ?? $_SESSION['admin_user_id'] ?? 0), $activeOutputScope);
            $msg = 'تم حفظ ' . $savedCount . ' مساراً ثابتاً للطباعة والمسح الضوئي.';
        } catch (Throwable $e) {
            $err = $e->getMessage();
        }
    }
}

$registry = ua_output_command_registry();
$routes = ua_output_load_routes($conn, $activeOutputScope);
$defaultAgentHost = '127.0.0.1';
$agentHealthHost = '127.0.0.1';
foreach ($routes as $savedRoute) {
    if (trim((string)($savedRoute['agent_host'] ?? '')) !== '') {
        $agentHealthHost = trim((string)$savedRoute['agent_host']);
        break;
    }
}
$discovery = ua_output_discover_windows_devices();
$printers = (array)($discovery['printers'] ?? []);
$scanners = (array)($discovery['scanners'] ?? []);
$printerNames = array_values(array_unique(array_filter(array_map(static fn($item) => trim((string)($item['name'] ?? '')), $printers))));
$scannerNames = array_values(array_unique(array_filter(array_map(static fn($item) => trim((string)($item['name'] ?? '')), $scanners))));
$assignedCount = 0;
foreach ($registry as $key => $command) if (trim((string)($routes[$key]['device_name'] ?? '')) !== '') $assignedCount++;
$recentJobs = [];
$outputScope = $conn->real_escape_string($activeOutputScope);
$jobsResult = @$conn->query("SELECT * FROM ua_output_jobs WHERE instance_key='{$outputScope}' ORDER BY id DESC LIMIT 30");
if ($jobsResult) while ($row = $jobsResult->fetch_assoc()) $recentJobs[] = $row;

require_once __DIR__ . '/header.php';
require_once __DIR__ . '/sidebar.php';
?>
<div class="content-wrapper ua-extracted-page <?= $isAndroid ? 'ua-output-android' : 'ua-output-desktop' ?>" dir="rtl">
  <section class="content">
    <div class="container-fluid ua-output-page">
      <?php if ($msg !== ''): ?><div class="alert alert-success"><?= h($msg) ?></div><?php endif; ?>
      <?php if ($err !== ''): ?><div class="alert alert-danger"><?= h($err) ?></div><?php endif; ?>

      <header class="ua-output-hero">
        <div class="ua-output-hero__title"><span><i class="fa fa-print"></i><i class="fa fa-file-image-o"></i></span><div><small>Output Routing Center</small><h1>الطابعات والماسحات</h1><p>تعيين طابعة أو ماسح ثابت لكل عملية في البرنامج لمنع تداخل العقود والفواتير والكروت والمستندات.</p></div></div>
        <div class="ua-output-hero__actions"><span id="uaOutputAgentStatus" class="is-checking"><i class="fa fa-circle"></i><b>وكيل الطباعة: جاري الفحص</b></span><?php if(ua_is_server_install()):?><a href="output_fleet.php"><i class="fa fa-sitemap"></i><span>مشاركة الطابعات بين النسخ</span></a><?php endif;?><a href="output_devices.php?<?= $isAndroid ? 'ua_android=1&amp;' : '' ?>refresh=1"><i class="fa fa-refresh"></i><span>إعادة اكتشاف الأجهزة</span></a></div>
      </header>

      <section class="ua-output-stats">
        <article><i class="fa fa-print"></i><div><strong><?= count($printers) ?></strong><span>طابعات معرفة في ويندوز</span></div></article>
        <article><i class="fa fa-file-image-o"></i><div><strong><?= count($scanners) ?></strong><span>ماسحات معرفة في ويندوز</span></div></article>
        <article><i class="fa fa-random"></i><div><strong><?= $assignedCount ?></strong><span>مسارات ثابتة محفوظة</span></div></article>
        <article><i class="fa fa-list-alt"></i><div><strong><?= count($registry) ?></strong><span>أوامر مسجلة في البرنامج</span></div></article>
      </section>

      <?php if (!empty($discovery['errors'])): ?><div class="ua-output-warning"><i class="fa fa-exclamation-triangle"></i><div><strong>اكتشاف جزئي للأجهزة</strong><p><?= h(implode(' — ', (array)$discovery['errors'])) ?></p></div></div><?php endif; ?>
      <div class="ua-output-warning ua-output-network-note"><i class="fa fa-sitemap"></i><div><strong>مشاركة طابعة USB بين عدة أجهزة</strong><p>شغّل البرنامج على الجهاز الموصول بالطابعة، ثم اختر من أيقونة وكيل الطباعة بجانب الساعة «عرض معلومات الربط الشبكي». أدخل عنوان الجهاز ومفتاح الربط في المسار المطلوب واضغط اكتشاف. يعمل الاتصال داخل الشبكات الخاصة فقط وتتم حماية أوامر الطباعة بالمفتاح.</p></div></div>

      <section class="ua-output-devices">
        <article class="ua-output-device-card">
          <header><span><i class="fa fa-print"></i></span><div><small>Windows Printers</small><h2>الطابعات المكتشفة</h2></div><b><?= count($printers) ?></b></header>
          <div class="ua-output-device-list">
            <?php foreach ($printers as $printer): ?><div><i class="fa fa-print"></i><span><strong><?= h((string)($printer['name'] ?? '')) ?></strong><small><?= h(trim((string)($printer['driver'] ?? '') . ' · ' . (string)($printer['port'] ?? ''), ' ·')) ?></small></span><?php if (!empty($printer['default'])): ?><b>الافتراضية</b><?php endif; ?></div><?php endforeach; ?>
            <?php if (!$printers): ?><p>لم يتم اكتشاف طابعات على هذا الكمبيوتر.</p><?php endif; ?>
          </div>
        </article>
        <article class="ua-output-device-card">
          <header><span><i class="fa fa-file-image-o"></i></span><div><small>Windows Scanners</small><h2>الماسحات المكتشفة</h2></div><b><?= count($scanners) ?></b></header>
          <div class="ua-output-device-list">
            <?php foreach ($scanners as $scanner): ?><div><i class="fa fa-file-image-o"></i><span><strong><?= h((string)($scanner['name'] ?? '')) ?></strong><small><?= h((string)($scanner['status'] ?? '')) ?></small></span></div><?php endforeach; ?>
            <?php if (!$scanners): ?><p>لم يتم اكتشاف ماسحات ضوئية على هذا الكمبيوتر.</p><?php endif; ?>
          </div>
        </article>
      </section>

      <form method="post" class="ua-output-routing">
        <?php if (function_exists('ua_csrf_field')) ua_csrf_field(); ?>
        <input type="hidden" name="action" value="save_routes">
        <input type="hidden" name="scope_key" value="<?= h($activeOutputScope) ?>">
        <div class="ua-output-section-head"><div><small>Fixed Device Mapping</small><h2>جدول مسارات الطباعة والمسح الضوئي</h2><p>اختيار الجهاز هنا يصبح التعيين الثابت لهذا الأمر حتى يتم تغييره من هذه الصفحة.</p></div><button type="submit"><i class="fa fa-floppy-o"></i><span>حفظ جميع المسارات</span></button></div>
        <div class="ua-output-table-wrap">
          <table class="ua-output-table">
            <thead><tr><th>الأمر</th><th>المصدر داخل البرنامج</th><th>النوع</th><th>الجهاز الثابت</th><th>جهاز الوكيل</th><th>الإعداد</th><th>الحالة</th></tr></thead>
            <tbody>
            <?php foreach ($registry as $key => $command):
              $saved = (array)($routes[$key] ?? []);
              $selected = (string)($saved['device_name'] ?? '');
              $isPrinter = $command['type'] === 'printer';
              $deviceNames = $isPrinter ? $printerNames : $scannerNames;
              $enabled = array_key_exists('is_enabled', $saved) ? (int)$saved['is_enabled'] === 1 : true;
              $paper = (string)($saved['paper_size'] ?? $command['paper']);
              $copies = max(1, (int)($saved['copies'] ?? 1));
            ?>
              <tr data-output-route data-output-type="<?= h((string)$command['type']) ?>" data-command-key="<?= h($key) ?>">
                <td><div class="ua-output-command"><span><i class="fa <?= h((string)$command['icon']) ?>"></i></span><div><strong><?= h((string)$command['label']) ?></strong><small><?= h((string)$command['group']) ?></small></div></div></td>
                <td><code dir="ltr"><?= h((string)$command['source']) ?></code></td>
                <td><span class="ua-output-kind <?= $isPrinter ? 'is-printer' : 'is-scanner' ?>"><i class="fa <?= $isPrinter ? 'fa-print' : 'fa-file-image-o' ?>"></i><?= $isPrinter ? 'طباعة' : 'مسح ضوئي' ?></span></td>
                <td><select class="ua-output-device-select" data-device-select name="routes[<?= h($key) ?>][device_name]" aria-label="الجهاز الثابت لـ <?= h((string)$command['label']) ?>"><option value="">بدون تعيين ثابت</option><?php if ($selected !== '' && !in_array($selected, $deviceNames, true)): ?><option selected value="<?= h($selected) ?>"><?= h($selected) ?> — محفوظ</option><?php endif; ?><?php foreach ($deviceNames as $name): ?><option value="<?= h($name) ?>" <?= $selected === $name ? 'selected' : '' ?>><?= h($name) ?></option><?php endforeach; ?></select></td>
                <td><div class="ua-output-agent-fields"><input data-agent-host name="routes[<?= h($key) ?>][agent_host]" value="<?= h((string)($saved['agent_host'] ?? $defaultAgentHost)) ?>" dir="ltr" placeholder="192.168.1.20 أو 127.0.0.1" title="عنوان جهاز وكيل الطباعة"><input data-agent-token type="password" name="routes[<?= h($key) ?>][agent_token]" value="<?= h((string)($saved['agent_token'] ?? '')) ?>" dir="ltr" autocomplete="off" placeholder="مفتاح الربط الشبكي"><button type="button" data-discover-device><i class="fa fa-search"></i><span>اكتشاف</span></button><small data-discover-status></small></div></td>
                <td><?php if ($isPrinter): $paperSizes=$key==='wifi_qr_cards'?['80mm','58mm']:['A4','A5','Letter','80mm','58mm']; ?><div class="ua-output-inline"><select name="routes[<?= h($key) ?>][paper_size]"><?php foreach ($paperSizes as $size): ?><option value="<?= h($size) ?>" <?= $paper === $size ? 'selected' : '' ?>><?= h($size) ?></option><?php endforeach; ?></select><label><span>نسخ</span><input type="number" min="1" max="99" name="routes[<?= h($key) ?>][copies]" value="<?= $copies ?>"></label></div><?php else: ?><input type="hidden" name="routes[<?= h($key) ?>][paper_size]" value="document"><input type="hidden" name="routes[<?= h($key) ?>][copies]" value="1"><span class="ua-output-doc">مستند</span><?php endif; ?></td>
                <td><label class="ua-output-switch"><input type="checkbox" name="routes[<?= h($key) ?>][is_enabled]" value="1" <?= $enabled ? 'checked' : '' ?>><span></span><b><?= $enabled ? 'مفعل' : 'متوقف' ?></b></label></td>
              </tr>
            <?php endforeach; ?>
            </tbody>
          </table>
        </div>
        <div class="ua-output-savebar"><p><i class="fa fa-info-circle"></i> عند تعذر الوصول إلى الجهاز الثابت سيظهر تنبيه قبل فتح مربع طباعة ويندوز، ولن يتم تحويل المهمة تلقائياً إلى طابعة أخرى.</p><button type="submit"><i class="fa fa-floppy-o"></i><span>حفظ جميع المسارات</span></button></div>
      </form>

      <section class="ua-output-history">
        <div class="ua-output-section-head"><div><small>Output Log</small><h2>آخر مهام الطباعة والمسح</h2><p>سجل تشغيلي يوضح الجهاز والحالة لكل مهمة.</p></div><b><?= count($recentJobs) ?></b></div>
        <?php if ($recentJobs): ?><div class="ua-output-table-wrap"><table class="ua-output-table ua-output-table--history"><thead><tr><th>الوقت</th><th>الأمر</th><th>الجهاز</th><th>الحالة</th><th>التفاصيل</th></tr></thead><tbody><?php foreach ($recentJobs as $job): $cmd=$registry[$job['command_key']]??null; ?><tr><td dir="ltr"><?= h((string)$job['created_at']) ?></td><td><?= h((string)($cmd['label']??$job['command_key'])) ?></td><td><?= h((string)($job['device_name']?:'غير محدد')) ?></td><td><span class="ua-output-job is-<?= h((string)$job['job_status']) ?>"><?= h((string)$job['job_status']) ?></span></td><td><?= h((string)$job['status_message']) ?></td></tr><?php endforeach; ?></tbody></table></div><?php else: ?><div class="ua-output-empty"><i class="fa fa-inbox"></i><h3>لا توجد مهام مسجلة بعد</h3><p>سيبدأ السجل بالظهور عند استخدام أوامر الطباعة والمسح المرتبطة.</p></div><?php endif; ?>
      </section>
    </div>
  </section>
</div>
<script>
(function(){
  var status=document.getElementById('uaOutputAgentStatus');
  if(!status)return;
  function agentBase(host){var value=String(host||'127.0.0.1').trim();if(!/^https?:\/\//i.test(value))value='http://'+value;try{var url=new URL(value);if(!url.port)url.port='9123';return url.origin}catch(error){return 'http://127.0.0.1:9123'}}
  var firstRoute=document.querySelector('[data-output-route]');
  var firstHost=firstRoute&&firstRoute.querySelector('[data-agent-host]')?firstRoute.querySelector('[data-agent-host]').value:'127.0.0.1';
  var firstToken=firstRoute&&firstRoute.querySelector('[data-agent-token]')?firstRoute.querySelector('[data-agent-token]').value:'';
  var healthHeaders={};if(firstToken)healthHeaders['X-UA-Output-Token']=firstToken;
  fetch(agentBase(firstHost)+'/health',{cache:'no-store',mode:'cors',headers:healthHeaders}).then(function(response){if(!response.ok)throw new Error();return response.json();}).then(function(){status.className='is-online';status.querySelector('b').textContent='وكيل الطباعة: متصل';}).catch(function(){status.className='is-offline';status.querySelector('b').textContent='وكيل الطباعة: غير متصل';});

  var csrf=<?= json_encode(function_exists('ua_csrf_token') ? ua_csrf_token() : '', JSON_UNESCAPED_SLASHES) ?>;
  document.querySelectorAll('[data-output-route]').forEach(function(row){
    var button=row.querySelector('[data-discover-device]');
    if(!button)return;
    button.addEventListener('click',async function(){
      var host=row.querySelector('[data-agent-host]').value.trim()||'127.0.0.1';
      var token=row.querySelector('[data-agent-token]').value.trim();
      var select=row.querySelector('[data-device-select]');
      var state=row.querySelector('[data-discover-status]');
      var selected=select.value;
      state.textContent='جاري الاتصال...';
      state.className='is-checking';
      button.disabled=true;
      try{
        var kind=row.dataset.outputType||'printer';
        var directHeaders={};if(token)directHeaders['X-UA-Output-Token']=token;
        var response=await fetch(agentBase(host)+'/'+(kind==='scanner'?'scanners':'printers'),{cache:'no-store',mode:'cors',headers:directHeaders});
        var result=await response.json().catch(function(){return {};});
        if(!response.ok||result.ok===false)throw new Error(result.error||('HTTP '+response.status));
        var directItems=kind==='scanner'?(result.scanners||[]):(result.printers||[]);
        result={ok:true,devices:directItems.map(function(item){return typeof item==='string'?item:String(item.name||'')}).filter(Boolean)};
        if(!response.ok||!result.ok)throw new Error(result.error||('HTTP '+response.status));
        select.innerHTML='<option value="">بدون تعيين ثابت</option>';
        (result.devices||[]).forEach(function(name){
          var option=document.createElement('option');option.value=name;option.textContent=name;if(name===selected)option.selected=true;select.appendChild(option);
        });
        state.textContent='تم العثور على '+(result.devices||[]).length+' جهاز';
        state.className='is-online';
      }catch(error){
        state.textContent=String(error&&error.message?error.message:'تعذر الاتصال');
        state.className='is-offline';
      }finally{button.disabled=false;}
    });
  });
})();
</script>
<?php require_once __DIR__ . '/footer.php'; ?>
