<?php
require_once __DIR__ . '/agent_portal_lib.php';
require_once __DIR__ . '/output_devices_lib.php';

$conn = ensure_db(true);
if (!($conn instanceof mysqli)) {
    http_response_code(500);
    exit('قاعدة البيانات غير جاهزة.');
}

$ctx = agent_portal_boot($conn);
$agentId = (int)($ctx['agent_id'] ?? 0);
$agent = $ctx['agent'] ?? null;
if (!$agent || empty($ctx['logged'])) {
    header('Location: agent_portal.php' . ($agentId > 0 ? '?agent=' . $agentId : ''));
    exit;
}

$baseScope = ua_output_agent_scope($agentId);
$requestedScope = trim((string)($_POST['scope_key'] ?? $_GET['scope_key'] ?? ''));
$actor = ua_output_authorized_scope($conn, $requestedScope);
if (empty($actor['authorized'])) {
    http_response_code(403);
    exit('نطاق إعدادات الطباعة غير مسموح.');
}
$activeScope = (string)$actor['scope'];

if (($_SERVER['REQUEST_METHOD'] ?? '') === 'GET' && $requestedScope === '') {
    $baseJson = json_encode($baseScope, 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",' . $baseJson . '+":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 (!ua_csrf_verify()) {
        $err = 'انتهت صلاحية النموذج. أعد فتح الصفحة وحاول مجدداً.';
    } else {
        try {
            $saved = ua_output_save_routes($conn, $_POST, 0, $activeScope);
            $msg = 'تم حفظ مسارات الطباعة لهذا الجهاز (' . $saved . ' أوامر).';
        } catch (Throwable $exception) {
            $err = $exception->getMessage();
        }
    }
}

$registry = array_filter(
    ua_output_command_registry(),
    static fn(array $command): bool => (string)($command['type'] ?? '') === 'printer'
);
$routes = ua_output_load_routes($conn, $activeScope);
$firstRoute = $routes ? reset($routes) : [];
$sharedHost = trim((string)($firstRoute['agent_host'] ?? '127.0.0.1')) ?: '127.0.0.1';
$sharedToken = trim((string)($firstRoute['agent_token'] ?? ''));

agent_portal_render_head('إعدادات الطابعات', ['assets/css/agent_output_devices.css']);
agent_portal_render_shell_start($conn, $ctx, 'printers');
?>
<?php if ($msg || $err): ?>
  <div class="ua-feedback-stack ap-toast-stack" role="status" aria-live="polite">
    <?php if ($msg): ?><div class="ap-toast ap-toast-success"><?= h($msg) ?></div><?php endif; ?>
    <?php if ($err): ?><div class="ap-toast ap-toast-danger"><?= h($err) ?></div><?php endif; ?>
  </div>
<?php endif; ?>

<section class="ap-panel ap-printer-page" dir="rtl">
  <header class="ap-printer-title">
    <div class="ap-printer-title__icon"><i class="fa fa-print"></i></div>
    <div>
      <small>PRINTER ROUTING</small>
      <h2>إعدادات الطابعات</h2>
    </div>
    <a href="agent_portal.php?agent=<?= $agentId ?>" class="ap-btn ap-btn-light"><i class="fa fa-arrow-right"></i> عودة</a>
  </header>

  <div class="ap-printer-source">
    <div class="ap-printer-source__heading">
      <div><strong>مصدر الطابعات لهذا الجهاز</strong></div>
      <span id="agentConnectionBadge" class="ap-printer-badge is-checking"><i class="fa fa-circle"></i> جارٍ الفحص</span>
    </div>
    <div class="ap-printer-source__grid">
      <label><span>عنوان جهاز الطباعة</span><input id="printerAgentHost" value="<?= h($sharedHost) ?>" dir="ltr" placeholder="127.0.0.1 أو 192.168.1.20"></label>
      <label><span>مفتاح الربط الشبكي</span><input id="printerAgentToken" value="<?= h($sharedToken) ?>" dir="ltr" type="password" autocomplete="off" placeholder="مطلوب فقط عند المشاركة عبر الشبكة"></label>
      <button type="button" class="ap-btn ap-btn-light" id="useLocalPrinters"><i class="fa fa-laptop"></i> طابعات هذا الجهاز</button>
      <button type="button" class="ap-btn ap-btn-primary" id="discoverPrinters"><i class="fa fa-search"></i> اكتشاف الطابعات</button>
    </div>
    <div id="printerDiscoveryMessage" class="ap-printer-message" aria-live="polite"></div>
    <div class="ap-printer-network-help">
      <i class="fa fa-sitemap"></i>
      <p><strong>مشاركة طابعة USB:</strong> اترك البرنامج يعمل على الجهاز الموصول بالطابعة، ثم أدخل عنوانه داخل الشبكة ومفتاح الربط الظاهر من أيقونة وكيل الطباعة بجانب الساعة. جميع الأوامر مشفرة بمفتاح الاقتران ولا تقبل من جهاز غير معتمد.</p>
    </div>
  </div>

  <form method="post" id="agentPrinterRoutes">
    <?php ua_csrf_field(); ?>
    <input type="hidden" name="action" value="save_routes">
    <input type="hidden" name="scope_key" value="<?= h($activeScope) ?>">

    <div class="ap-printer-route-head">
      <div><h3>مسار كل أمر طباعة</h3></div>
      <button type="submit" class="ap-btn ap-btn-success"><i class="fa fa-floppy-o"></i> حفظ الإعدادات</button>
    </div>

    <div class="ap-printer-routes">
      <?php foreach ($registry as $key => $command):
        $saved = (array)($routes[$key] ?? []);
        $selected = (string)($saved['device_name'] ?? '');
        $paper = (string)($saved['paper_size'] ?? $command['paper']);
        $copies = max(1, (int)($saved['copies'] ?? 1));
        $enabled = array_key_exists('is_enabled', $saved) ? (int)$saved['is_enabled'] === 1 : true;
        $paperSizes = $key === 'wifi_qr_cards' ? ['80mm', '58mm'] : ['A4', 'A5', 'Letter', '80mm', '58mm'];
      ?>
      <article class="ap-printer-route" data-printer-route>
        <input type="hidden" name="route_keys[]" value="<?= h($key) ?>">
        <input data-route-host type="hidden" name="routes[<?= h($key) ?>][agent_host]" value="<?= h((string)($saved['agent_host'] ?? $sharedHost)) ?>">
        <input data-route-token type="hidden" name="routes[<?= h($key) ?>][agent_token]" value="<?= h((string)($saved['agent_token'] ?? $sharedToken)) ?>">
        <div class="ap-printer-route__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>
        <label class="ap-printer-field ap-printer-field--wide">
          <span>الطابعة</span>
          <select data-printer-select name="routes[<?= h($key) ?>][device_name]">
            <option value="">استخدام مربع طباعة ويندوز</option>
            <?php if ($selected !== ''): ?><option value="<?= h($selected) ?>" selected><?= h($selected) ?> — محفوظة</option><?php endif; ?>
          </select>
        </label>
        <label class="ap-printer-field"><span>الورق</span><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>
        <label class="ap-printer-field"><span>النسخ</span><input type="number" min="1" max="99" name="routes[<?= h($key) ?>][copies]" value="<?= $copies ?>"></label>
        <label class="ap-printer-toggle"><input type="checkbox" name="routes[<?= h($key) ?>][is_enabled]" value="1" <?= $enabled ? 'checked' : '' ?>><span></span><b>مفعّل</b></label>
      </article>
      <?php endforeach; ?>
    </div>

    <div class="ap-printer-savebar">
      <span><i class="fa fa-shield"></i> تُحفظ المسارات لهذه النسخة فقط.</span>
      <button type="submit" class="ap-btn ap-btn-success"><i class="fa fa-floppy-o"></i> حفظ إعدادات الطابعات</button>
    </div>
  </form>
</section>

<script>
(function(){
  'use strict';
  var hostInput=document.getElementById('printerAgentHost');
  var tokenInput=document.getElementById('printerAgentToken');
  var discoverButton=document.getElementById('discoverPrinters');
  var localButton=document.getElementById('useLocalPrinters');
  var message=document.getElementById('printerDiscoveryMessage');
  var badge=document.getElementById('agentConnectionBadge');
  var form=document.getElementById('agentPrinterRoutes');

  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'}
  }
  function headers(){var result={};var token=tokenInput.value.trim();if(token)result['X-UA-Output-Token']=token;return result}
  function syncRouteSource(){
    document.querySelectorAll('[data-route-host]').forEach(function(input){input.value=hostInput.value.trim()||'127.0.0.1'});
    document.querySelectorAll('[data-route-token]').forEach(function(input){input.value=tokenInput.value.trim()});
  }
  function setState(kind,text){
    badge.className='ap-printer-badge '+kind;
    badge.innerHTML='<i class="fa fa-circle"></i> '+text;
  }
  function fillPrinters(printers){
    document.querySelectorAll('[data-printer-select]').forEach(function(select){
      var current=select.value;
      select.innerHTML='<option value="">استخدام مربع طباعة ويندوز</option>';
      printers.forEach(function(name){var option=document.createElement('option');option.value=name;option.textContent=name;if(name===current)option.selected=true;select.appendChild(option)});
      if(current&&!printers.includes(current)){var saved=document.createElement('option');saved.value=current;saved.textContent=current+' — غير متاحة حالياً';saved.selected=true;select.appendChild(saved)}
    });
  }
  async function discover(){
    discoverButton.disabled=true;
    message.className='ap-printer-message is-checking';
    message.textContent='جارٍ الاتصال بجهاز الطباعة واكتشاف الطابعات...';
    syncRouteSource();
    try{
      var response=await fetch(agentBase(hostInput.value)+'/printers',{cache:'no-store',mode:'cors',headers:headers()});
      var result=await response.json().catch(function(){return []});
      if(!response.ok)throw new Error(result.error||('HTTP '+response.status));
      var printers=(Array.isArray(result)?result:(result.printers||[])).map(function(item){return typeof item==='string'?item:String(item.name||'')}).filter(Boolean);
      fillPrinters(printers);
      setState('is-online','متصل');
      message.className='ap-printer-message is-online';
      message.textContent=printers.length?'تم اكتشاف '+printers.length+' طابعة. اختر مسار كل أمر ثم احفظ.':'تم الاتصال، لكن لا توجد طابعات مثبتة على هذا الجهاز.';
    }catch(error){
      setState('is-offline','غير متصل');
      message.className='ap-printer-message is-offline';
      var errorText=String(error&&error.message?error.message:'');
      message.textContent=/failed to fetch/i.test(errorText)?'تعذر الوصول إلى وكيل الطباعة. تأكد من تشغيل البرنامج على جهاز الطباعة ومن صحة العنوان ومفتاح الربط.':(errorText||'تعذر الاتصال بوكيل الطباعة.');
    }finally{discoverButton.disabled=false}
  }
  localButton.addEventListener('click',function(){hostInput.value='127.0.0.1';tokenInput.value='';discover()});
  discoverButton.addEventListener('click',discover);
  form.addEventListener('submit',syncRouteSource);
  discover();
})();
</script>
<?php agent_portal_render_shell_end(); ?>
