```php
<?php
if (!defined('ABSPATH')) exit;

/**
 * OGM Test Oluşturucu – Frontend
 * Shortcode: [ogm_test_olustur]
 *
 * Normal mod: Builder UI
 * Print mod: ?print=1&ids=1,2,3  => Şablonlu test çıktısı (SVG dahil) (TEMA BYPASS)
 */

if (!function_exists('ogm_test_norm_text')) {
  function ogm_test_norm_text($v){
    if (is_array($v)) $v = implode("\n", $v);
    return (string)$v;
  }
}

if (!function_exists('ogm_test_get_active_svg_for_question')) {
  function ogm_test_get_active_svg_for_question($sid) {
    $sid = (int)$sid;
    if (!$sid) return '';

    $svg = (string) get_post_meta($sid, '_og_soru_gorsel_svg', true);
    if ($svg !== '' && stripos($svg, '<svg') !== false) return $svg;

    $active_id = (string) get_post_meta($sid, '_og_soru_gorsel_active_id', true);
    $gallery   = get_post_meta($sid, '_og_soru_gorsel_gallery', true);
    if (!is_array($gallery) || empty($gallery)) return '';

    if ($active_id !== '') {
      foreach ($gallery as $it) {
        if (!is_array($it)) continue;
        if ((string)($it['id'] ?? '') === $active_id && (string)($it['type'] ?? '') === 'svg') {
          $svg2 = (string)($it['svg'] ?? '');
          if ($svg2 !== '' && stripos($svg2, '<svg') !== false) return $svg2;
        }
      }
    }

    foreach ($gallery as $it) {
      if (!is_array($it)) continue;
      if ((string)($it['type'] ?? '') === 'svg') {
        $svg2 = (string)($it['svg'] ?? '');
        if ($svg2 !== '' && stripos($svg2, '<svg') !== false) return $svg2;
      }
    }

    return '';
  }
}

if (!function_exists('ogm_test_svg_to_data_uri')) {
  function ogm_test_svg_to_data_uri($svg){
    $svg = (string)$svg;
    if ($svg === '') return '';

    $svg = preg_replace('/^\xEF\xBB\xBF/', '', $svg);
    $svg = trim($svg);

    $b64 = base64_encode($svg);
    return 'data:image/svg+xml;base64,' . $b64;
  }
}

if (!function_exists('ogm_test_render_print_page')) {
  function ogm_test_render_print_page(){

    $ids_raw  = isset($_GET['ids']) ? sanitize_text_field(wp_unslash($_GET['ids'])) : '';
    $ids      = array_values(array_filter(array_map('absint', preg_split('/\s*,\s*/', $ids_raw))));
    $test_adi = isset($_GET['test_adi']) ? sanitize_text_field(wp_unslash($_GET['test_adi'])) : 'DENEME TESTİ';
    $ders     = isset($_GET['ders']) ? sanitize_text_field(wp_unslash($_GET['ders'])) : '';
    $sinif    = isset($_GET['sinif']) ? sanitize_text_field(wp_unslash($_GET['sinif'])) : '';

    $top_bg    = isset($_GET['top_bg']) ? esc_url_raw(wp_unslash($_GET['top_bg'])) : '';
    $bottom_bg = isset($_GET['bottom_bg']) ? esc_url_raw(wp_unslash($_GET['bottom_bg'])) : '';
    $logo_url  = isset($_GET['logo']) ? esc_url_raw(wp_unslash($_GET['logo'])) : '';

    // Auto print (debug için kapatabil)
    $autoprint = isset($_GET['autoprint']) ? (int)$_GET['autoprint'] : 1;

    // SVG max height (mm)
    $svg_max_mm = isset($_GET['svg_max']) ? (int)$_GET['svg_max'] : 62;
    if ($svg_max_mm < 30) $svg_max_mm = 30;
    if ($svg_max_mm > 120) $svg_max_mm = 120;

    // Sayfa ölçü
    $paper_w_mm  = 210;
    $paper_h_mm  = 297;

    $pad_l_mm    = 12;
    $pad_r_mm    = 12;

    $hdr_h_mm    = 26;
    $ftr_h_mm    = 16;

    $col_gap_mm  = 12;

    $space = isset($_GET['space']) ? (int)$_GET['space'] : 3; // 1-5
    $gap_mm = [1=>5,2=>6,3=>7,4=>8,5=>9];
    $q_gap_mm = $gap_mm[$space] ?? 7;

    $allowed_svg = [
      'svg' => [
        'xmlns'=>true,'xmlns:xlink'=>true,'viewBox'=>true,'width'=>true,'height'=>true,
        'fill'=>true,'stroke'=>true,'stroke-width'=>true,'class'=>true,'style'=>true,
        'preserveAspectRatio'=>true
      ],
      'defs'=>['id'=>true,'class'=>true,'style'=>true],
      'style'=>['type'=>true],
      'title'=>[],'desc'=>[],
      'g'   => ['fill'=>true,'stroke'=>true,'stroke-width'=>true,'transform'=>true,'class'=>true,'style'=>true,'opacity'=>true,'clip-path'=>true,'mask'=>true],
      'path'=> ['d'=>true,'fill'=>true,'stroke'=>true,'stroke-width'=>true,'transform'=>true,'class'=>true,'style'=>true,'opacity'=>true,'stroke-linecap'=>true,'stroke-linejoin'=>true],
      'rect'=> ['x'=>true,'y'=>true,'width'=>true,'height'=>true,'rx'=>true,'ry'=>true,'fill'=>true,'stroke'=>true,'stroke-width'=>true,'class'=>true,'style'=>true,'opacity'=>true,'transform'=>true],
      'circle'=>['cx'=>true,'cy'=>true,'r'=>true,'fill'=>true,'stroke'=>true,'stroke-width'=>true,'class'=>true,'style'=>true,'opacity'=>true],
      'ellipse'=>['cx'=>true,'cy'=>true,'rx'=>true,'ry'=>true,'fill'=>true,'stroke'=>true,'stroke-width'=>true,'class'=>true,'style'=>true,'opacity'=>true],
      'line'=>['x1'=>true,'y1'=>true,'x2'=>true,'y2'=>true,'stroke'=>true,'stroke-width'=>true,'class'=>true,'style'=>true,'opacity'=>true,'stroke-linecap'=>true],
      'polyline'=>['points'=>true,'fill'=>true,'stroke'=>true,'stroke-width'=>true,'class'=>true,'style'=>true,'opacity'=>true,'stroke-linecap'=>true,'stroke-linejoin'=>true],
      'polygon'=>['points'=>true,'fill'=>true,'stroke'=>true,'stroke-width'=>true,'class'=>true,'style'=>true,'opacity'=>true,'stroke-linecap'=>true,'stroke-linejoin'=>true],
      'text'=>[
        'x'=>true,'y'=>true,'dx'=>true,'dy'=>true,'text-anchor'=>true,'font-size'=>true,'font-family'=>true,
        'fill'=>true,'stroke'=>true,'stroke-width'=>true,'class'=>true,'style'=>true,'transform'=>true,
        'font-weight'=>true,'dominant-baseline'=>true
      ],
      'tspan'=>[
        'x'=>true,'y'=>true,'dx'=>true,'dy'=>true,'text-anchor'=>true,'font-size'=>true,'font-family'=>true,
        'fill'=>true,'stroke'=>true,'stroke-width'=>true,'class'=>true,'style'=>true,'font-weight'=>true
      ],
      'clipPath'=>['id'=>true,'clipPathUnits'=>true],
      'mask'=>['id'=>true,'maskUnits'=>true,'x'=>true,'y'=>true,'width'=>true,'height'=>true],
      'linearGradient'=>['id'=>true,'x1'=>true,'y1'=>true,'x2'=>true,'y2'=>true,'gradientUnits'=>true],
      'radialGradient'=>['id'=>true,'cx'=>true,'cy'=>true,'r'=>true,'fx'=>true,'fy'=>true,'gradientUnits'=>true],
      'stop'=>['offset'=>true,'stop-color'=>true,'stop-opacity'=>true],
      'use'=>['href'=>true,'xlink:href'=>true,'x'=>true,'y'=>true,'width'=>true,'height'=>true,'transform'=>true],
      'image'=>['href'=>true,'xlink:href'=>true,'x'=>true,'y'=>true,'width'=>true,'height'=>true,'preserveAspectRatio'=>true],
      'marker'=>['id'=>true,'markerWidth'=>true,'markerHeight'=>true,'refX'=>true,'refY'=>true,'orient'=>true,'markerUnits'=>true,'viewBox'=>true],
    ];

    ob_start();
    ?>
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title><?php echo esc_html($test_adi); ?></title>
  <style>
    @page{
      size: <?php echo (int)$paper_w_mm; ?>mm <?php echo (int)$paper_h_mm; ?>mm;
      margin: 0;
    }
    html,body{ margin:0; padding:0; height:auto; }
    body{
      -webkit-print-color-adjust: exact;
      print-color-adjust: exact;
      font-family: Arial, sans-serif;
      color:#111;
      background:#e9eef5;
      --ogm-svg-max-h: <?php echo (int)$svg_max_mm; ?>mm;
    }

    /* EKRANDA gerçek A4 sayfa hissi için yükseklik sabit */
    .page{
      width: <?php echo (int)$paper_w_mm; ?>mm;
      height: <?php echo (int)$paper_h_mm; ?>mm;
      background:#fff;
      margin: 12mm auto;
      box-shadow: 0 10px 30px rgba(0,0,0,.18);
      position: relative;
      overflow: hidden;
    }
    @media print{
      body{ background:#fff; }
      .page{ margin:0; box-shadow:none; height:auto; overflow: visible; }
    }

    .a4-fixed{
      position: fixed;
      left: 50%;
      transform: translateX(-50%);
      width: <?php echo (int)$paper_w_mm; ?>mm;
      pointer-events: none;
      z-index: 20;
    }

    .hdr-fixed{ top:0; height: <?php echo (int)$hdr_h_mm; ?>mm; }
    .ftr-fixed{ bottom:0; height: <?php echo (int)$ftr_h_mm; ?>mm; }

    .hdr-bg, .ftr-bg{
      position:absolute; inset:0;
      background:#fff;
      background-size: cover;
      background-repeat:no-repeat;
      background-position:center;
    }
    <?php if($top_bg): ?>
      .hdr-bg{ background-image:url('<?php echo esc_url($top_bg); ?>'); }
    <?php endif; ?>
    <?php if($bottom_bg): ?>
      .ftr-bg{ background-image:url('<?php echo esc_url($bottom_bg); ?>'); }
    <?php endif; ?>

    .hdr-inner{
      position: relative;
      height: 100%;
      padding: 5mm <?php echo (int)$pad_r_mm; ?>mm 2mm <?php echo (int)$pad_l_mm; ?>mm;
      display:flex;
      align-items:flex-start;
      justify-content:space-between;
      gap: 8mm;
      pointer-events: none;
    }
    .hdr-left, .hdr-right{ flex: 1 1 40%; min-width: 50mm; }
    .hdr-center{
      flex: 0 0 26mm;
      display:flex;
      align-items:flex-start;
      justify-content:center;
      padding-top: 1mm;
    }
    .hdr-title{ font-weight: 800; font-size: 12.5pt; line-height: 1.1; }
    .hdr-sub{ margin-top: 1mm; font-size: 10pt; color:#333; }
    .hdr-right{ text-align:right; }
    .hdr-logo{ width: 22mm; height: auto; display:block; }
    .hdr-logo-fallback{
      width: 22mm; height: 22mm;
      display:flex; align-items:center; justify-content:center;
      font-weight: 900; font-size: 22pt; color:#0b4b5a; opacity:.22;
      border-radius: 6mm;
    }

    .hdr-fields{
      position:absolute;
      left: <?php echo (int)$pad_l_mm; ?>mm;
      right: <?php echo (int)$pad_r_mm; ?>mm;
      bottom: 2mm;
      display:flex;
      gap: 8mm;
      flex-wrap:wrap;
      font-size: 10pt;
      color:#111;
    }
    .hdr-fields span{ white-space:nowrap; }

    .mid-fixed{
      position: fixed;
      left: 50%;
      transform: translateX(-50%);
      width: <?php echo (int)$paper_w_mm; ?>mm;
      top: <?php echo (int)$hdr_h_mm; ?>mm;
      bottom: <?php echo (int)$ftr_h_mm; ?>mm;
      z-index: 19;
      pointer-events: none;
    }
    .mid-fixed:after{
      content:"";
      position:absolute;
      left: 50%;
      top: 0;
      bottom: 0;
      width: 1px;
      background: rgba(255,122,0,.55);
      transform: translateX(-50%);
    }
    .mid-tag{
      position:absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      z-index: 21;
      padding: 1.2mm 1.8mm;
      border: 1px solid #dc2626;
      color: #dc2626;
      font-weight: 800;
      font-size: 9pt;
      border-radius: 2mm;
      background:#fff;
      white-space: nowrap;
    }
    .mid-tag span{
      display:block;
      writing-mode: vertical-rl;
      text-orientation: mixed;
      line-height: 1;
    }

    .ftr-inner{
      position: relative;
      height: 100%;
      padding: 0 <?php echo (int)$pad_r_mm; ?>mm 3mm <?php echo (int)$pad_l_mm; ?>mm;
      display:flex;
      align-items:flex-end;
      justify-content:space-between;
      gap: 8mm;
      pointer-events: none;
    }
    .ftr-line{
      position:absolute;
      left: <?php echo (int)$pad_l_mm; ?>mm;
      right: <?php echo (int)$pad_r_mm; ?>mm;
      top: 3mm;
      height: 1px;
      background: rgba(255,122,0,.55);
    }
    .page-num{
      flex: 1 1 auto;
      text-align:center;
      font-size: 9.5pt;
      font-weight: 700;
      color:#111;
    }
    .page-num:after{ content: counter(page); }
    .ftr-right{ flex: 0 0 auto; font-size: 8.5pt; color:#111; }

    .content{
      height: 100%;
      box-sizing: border-box;
      padding: calc(<?php echo (int)$hdr_h_mm; ?>mm + 3mm) <?php echo (int)$pad_r_mm; ?>mm calc(<?php echo (int)$ftr_h_mm; ?>mm + 3mm) <?php echo (int)$pad_l_mm; ?>mm;
    }

    .cols{
      height: 100%;
      column-count: 2;
      column-gap: <?php echo (int)$col_gap_mm; ?>mm;
      column-fill: auto;
    }

    /* ✅ Daha stabil kolon davranışı */
    .q{
      display:block;
      width:100%;
      -webkit-column-break-inside: avoid;
      break-inside: avoid;
      page-break-inside: avoid;
      margin: 0 0 <?php echo (int)$q_gap_mm; ?>mm 0;
    }

    .qtxt{ font-size: 10.8pt; line-height: 1.28; }
    .qnum{ font-weight: 800; margin-right: 2mm; color:#d11; }

    .fig{
      margin: 2.5mm 0;
      max-height: var(--ogm-svg-max-h);
      overflow: hidden;
      -webkit-column-break-inside: avoid;
      break-inside: avoid;
      page-break-inside: avoid;
    }
    .fig-img{
      display:block;
      width:100%;
      height:auto;
      max-width:100%;
      max-height: var(--ogm-svg-max-h);
      object-fit: contain;
      -webkit-column-break-inside: avoid;
      break-inside: avoid;
      page-break-inside: avoid;
    }

    .opt{ font-size: 10.4pt; margin: 1.1mm 0; }

    /* Sayfa wrapper (ekranda JS sayfalama için) */
    #ogm-pages{ width:100%; }

    /* Çok uzun soru olursa (tek sayfaya sığmazsa) uyarısız bozulmasın */
    .ogm-too-tall{ outline: 2px dashed rgba(220,38,38,.35); outline-offset: 2px; }
  </style>
</head>
<body>

  <div class="a4-fixed hdr-fixed">
    <div class="hdr-bg"></div>

    <div class="hdr-inner">
      <div class="hdr-left">
        <div class="hdr-title"><?php echo esc_html($test_adi); ?></div>
        <?php if($ders !== ''): ?>
          <div class="hdr-sub"><?php echo esc_html($ders); ?></div>
        <?php endif; ?>
      </div>

      <div class="hdr-center">
        <?php if($logo_url): ?>
          <img class="hdr-logo" src="<?php echo esc_url($logo_url); ?>" alt="">
        <?php else: ?>
          <div class="hdr-logo-fallback">A</div>
        <?php endif; ?>
      </div>

      <div class="hdr-right">
        <?php if($ders !== ''): ?>
          <div class="hdr-title"><?php echo esc_html($ders); ?></div>
        <?php else: ?>
          <div class="hdr-title">&nbsp;</div>
        <?php endif; ?>
        <?php if($sinif !== ''): ?>
          <div class="hdr-sub"><?php echo esc_html($sinif); ?></div>
        <?php endif; ?>
      </div>
    </div>

    <div class="hdr-fields">
      <span>Ad Soyad: ____________________</span>
      <span>No: ______</span>
      <span>Sınıf: <?php echo esc_html($sinif ?: '______'); ?></span>
    </div>
  </div>

  <div class="mid-fixed">
    <div class="mid-tag"><span>ogretmenim.tr</span></div>
  </div>

  <div class="a4-fixed ftr-fixed">
    <div class="ftr-bg"></div>
    <div class="ftr-line"></div>
    <div class="ftr-inner">
      <div style="flex:1 1 auto;"></div>
      <div class="page-num"></div>
      <div class="ftr-right">diğer sayfaya geçiniz.</div>
    </div>
  </div>

  <!-- ✅ JS ekranda sayfalama yapacağı için tüm sayfalar buraya gelecek -->
  <div id="ogm-pages">
    <div class="page" data-page="1">
      <div class="content">
        <div class="cols" id="ogm-cols-1">
          <?php
          $i = 1;
          foreach ($ids as $sid) {
            $p = get_post($sid);
            if (!$p || $p->post_type !== 'soru') continue;

            $metin = ogm_test_norm_text(get_post_meta($sid, '_og_soru_metin', true));
            if ($metin === '') $metin = ogm_test_norm_text(get_post_meta($sid, '_szm_soru_metin', true));

            $a = (string)get_post_meta($sid, '_og_soru_a', true);
            $b = (string)get_post_meta($sid, '_og_soru_b', true);
            $c = (string)get_post_meta($sid, '_og_soru_c', true);
            $d = (string)get_post_meta($sid, '_og_soru_d', true);
            $e = (string)get_post_meta($sid, '_og_soru_e', true);

            $svg = ogm_test_get_active_svg_for_question($sid);
            $svg_safe = $svg ? wp_kses($svg, $allowed_svg) : '';
            $svg_uri = '';

            if ($svg_safe !== '' && stripos($svg_safe,'<svg') !== false) {
              $svg_uri = ogm_test_svg_to_data_uri($svg_safe);
            }
            ?>
            <div class="q" data-q="<?php echo (int)$i; ?>">
              <div class="qtxt">
                <span class="qnum"><?php echo (int)$i; ?>.</span>
                <?php echo wp_kses_post(nl2br($metin)); ?>
              </div>

              <?php if ($svg_uri !== ''): ?>
                <div class="fig">
                  <img class="fig-img" src="<?php echo esc_attr($svg_uri); ?>" alt="">
                </div>
              <?php endif; ?>

              <?php if($a!==''): ?><div class="opt">A) <?php echo esc_html($a); ?></div><?php endif; ?>
              <?php if($b!==''): ?><div class="opt">B) <?php echo esc_html($b); ?></div><?php endif; ?>
              <?php if($c!==''): ?><div class="opt">C) <?php echo esc_html($c); ?></div><?php endif; ?>
              <?php if($d!==''): ?><div class="opt">D) <?php echo esc_html($d); ?></div><?php endif; ?>
              <?php if($e!==''): ?><div class="opt">E) <?php echo esc_html($e); ?></div><?php endif; ?>
            </div>
            <?php
            $i++;
          }

          if (empty($ids)) {
            echo '<div style="color:#666">ids boş geldi.</div>';
          }
          ?>
        </div>
      </div>
    </div>
  </div>

  <?php if ($autoprint === 1): ?>
  <script>
    (function(){
      function go(){ try{ window.print(); }catch(e){} }
      if(document.readyState === 'complete') setTimeout(go, 80);
      else window.addEventListener('load', function(){ setTimeout(go, 80); });
    })();
  </script>
  <?php endif; ?>

  <!-- ✅ EKRANDA 2. sayfaya geçince tek sütuna kayma sorununu %100 çözen: JS A4 sayfalama -->
  <script>
  (function(){
    // Print modunda müdahale etme
    if (window.matchMedia && window.matchMedia('print').matches) return;

    function debounce(fn, wait){
      var t = null;
      return function(){
        clearTimeout(t);
        var args = arguments, ctx = this;
        t = setTimeout(function(){ fn.apply(ctx, args); }, wait || 150);
      };
    }

    function makePage(pageNo){
      var pages = document.getElementById('ogm-pages');
      var p = document.createElement('div');
      p.className = 'page';
      p.setAttribute('data-page', String(pageNo));

      var content = document.createElement('div');
      content.className = 'content';

      var cols = document.createElement('div');
      cols.className = 'cols';
      cols.id = 'ogm-cols-' + pageNo;

      content.appendChild(cols);
      p.appendChild(content);
      pages.appendChild(p);
      return {page:p, content:content, cols:cols};
    }

    function maxBottom(rects){
      var b = 0;
      for (var i=0;i<rects.length;i++){
        if (rects[i].bottom > b) b = rects[i].bottom;
      }
      return b;
    }

    function paginate(){
      // Yazdırma sırasında tetiklenmesin
      if (window.matchMedia && window.matchMedia('print').matches) return;

      var pagesWrap = document.getElementById('ogm-pages');
      if (!pagesWrap) return;

      // İlk sayfayı referans al
      var firstPage = pagesWrap.querySelector('.page[data-page="1"]');
      if (!firstPage) return;

      // Eski ekstra sayfaları temizle (yeniden sayfala)
      var extra = pagesWrap.querySelectorAll('.page:not([data-page="1"])');
      for (var i=0;i<extra.length;i++) extra[i].parentNode.removeChild(extra[i]);

      var firstCols = document.getElementById('ogm-cols-1');
      if (!firstCols) return;

      // Tüm soruları topla (NodeList canlı olmasın)
      var qs = Array.prototype.slice.call(firstCols.querySelectorAll('.q'));

      // İlk sayfadaki cols'u boşalt (yeniden dağıtacağız)
      firstCols.innerHTML = '';

      var currentPageNo = 1;
      var current = { page:firstPage, content:firstPage.querySelector('.content'), cols:firstCols };

      // İçerik alanı alt sınırı (px)
      function contentBottom(){
        var r = current.content.getBoundingClientRect();
        return r.bottom - 1; // küçük tolerans
      }

      // Önce ölçümler stabil olsun diye DOM'a en az 1 soru koy
      for (var qi=0; qi<qs.length; qi++){
        var q = qs[qi];
        current.cols.appendChild(q);

        // q birinci mi ikinci kolona mı düştü vs, gerçek konumuna göre taşma kontrolü
        var qRects = q.getClientRects();
        if (!qRects || !qRects.length) continue;

        var bottom = maxBottom(qRects);
        var limit = contentBottom();

        if (bottom > limit){
          // taşarsa geri al
          current.cols.removeChild(q);

          // yeni sayfa
          currentPageNo++;
          current = makePage(currentPageNo);

          current.cols.appendChild(q);

          // Eğer tek soru bile sayfayı taşıyorsa işaretle (çok büyük SVG vs)
          var rr = q.getClientRects();
          if (rr && rr.length){
            var b2 = maxBottom(rr);
            var lim2 = contentBottom();
            if (b2 > lim2){
              q.classList.add('ogm-too-tall');
            } else {
              q.classList.remove('ogm-too-tall');
            }
          }
        } else {
          q.classList.remove('ogm-too-tall');
        }
      }
    }

    // Görseller (data-uri) bile olsa layout bazen load sonrası değişiyor
    var run = debounce(paginate, 120);

    window.addEventListener('load', function(){
      // 2 tur: font/scale otursun diye
      run();
      setTimeout(run, 260);
      setTimeout(run, 700);
    });

    window.addEventListener('resize', run);

    // Print açılmadan hemen önce ekranda sayfalama zaten var, ama garanti
    if (window.matchMedia){
      var mq = window.matchMedia('print');
      if (mq && mq.addEventListener){
        mq.addEventListener('change', function(e){
          if (!e.matches) { // printten çıkınca
            setTimeout(run, 120);
          }
        });
      }
    }
  })();
  </script>

</body>
</html>
    <?php
    return ob_get_clean();
  }
}

add_action('init', function(){
  if (empty($_GET['print']) || (string)$_GET['print'] !== '1') return;

  if (!headers_sent()) {
    status_header(200);
    nocache_headers();
    header('Content-Type: text/html; charset=UTF-8');
  }

  echo ogm_test_render_print_page();
  exit;
}, 0);

/* ============================
 * Builder UI (print değilken)
 * ============================ */
add_action('wp_enqueue_scripts', function () {

  if (!empty($_GET['print']) && (string)$_GET['print'] === '1') return;

  wp_enqueue_script('jquery');
  wp_enqueue_script('jquery-ui-sortable');

  wp_register_style('ogm-test-builder', false, [], '1.7.2');
  wp_enqueue_style('ogm-test-builder');

  wp_register_script('ogm-test-builder', false, ['jquery', 'jquery-ui-sortable'], '1.7.2', true);
  wp_enqueue_script('ogm-test-builder');

  $css = <<<'CSS'
.ogm-wrap{max-width:1100px;margin:0 auto;padding:24px 12px;}
.ogm-topbar{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap;padding:14px 14px;border:1px solid #e6e8ef;border-radius:12px;background:#fff;box-shadow:0 10px 30px rgba(15,23,42,.06);}
.ogm-field{flex:1 1 200px;min-width:180px;}
.ogm-field label{display:block;font-size:13px;margin:0 0 6px 2px;color:#334155;}
.ogm-field input,.ogm-field select{width:100%;height:42px;border-radius:10px;border:1px solid #d7dbe7;padding:0 12px;background:#fff;outline:none;}
.ogm-field input[readonly]{background:#f8fafc;}
.ogm-actions{display:flex;gap:10px;align-items:center;}
.ogm-btn{height:42px;border-radius:10px;border:1px solid #111827;background:#111827;color:#fff;padding:0 14px;font-weight:600;cursor:pointer;}
.ogm-btn.secondary{background:#fff;color:#111827;border-color:#d7dbe7;}
.ogm-btn:disabled{opacity:.5;cursor:not-allowed;}

.ogm-tree-wrap{border:1px solid #e6e8ef;border-radius:12px;padding:12px;background:#fff;margin-top:12px;box-shadow:0 10px 30px rgba(15,23,42,.06);}
.ogm-tree-head{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;margin-bottom:10px;}
.ogm-breadcrumb{font-size:12px;background:#f1f5f9;border:1px solid #e2e8f0;padding:6px 10px;border-radius:999px;display:none;}
.ogm-help{font-size:12px;color:#64748b;margin:0;}
.ogm-tree{list-style:none;margin:0;padding:0;}
.ogm-node{border:1px solid #e6e8ef;border-radius:12px;padding:10px;margin:8px 0;background:#fff;}
.ogm-node-top{display:flex;justify-content:space-between;gap:10px;align-items:flex-start;}
.ogm-node-toggle{display:flex;gap:10px;align-items:center;border:0;background:none;cursor:pointer;font-size:13px;padding:0;text-align:left;}
.ogm-node-toggle strong{font-weight:800;}
.ogm-chev{width:22px;height:22px;border-radius:8px;background:#f1f5f9;border:1px solid #e2e8f0;display:flex;align-items:center;justify-content:center;transition:transform .15s ease;}
.ogm-node.is-open .ogm-chev{transform:rotate(90deg);}
.ogm-node-children{margin-left:16px;padding-left:12px;border-left:2px dashed #e2e8f0;display:none}
.ogm-node label{display:flex;gap:10px;align-items:flex-start;font-size:13px;color:#0f172a;}
.ogm-node-sub{font-size:11px;color:#64748b;margin-top:6px;}

.ogm-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px;}
@media (max-width:980px){.ogm-grid{grid-template-columns:1fr;}}
.ogm-panel{background:#fff;border:1px solid #e6e8ef;border-radius:12px;overflow:hidden;box-shadow:0 10px 30px rgba(15,23,42,.06);}
.ogm-panel h3{margin:0;padding:12px 14px;font-size:14px;background:linear-gradient(90deg,#0f172a,#111827);color:#fff;}
.ogm-panel .ogm-body{padding:10px 12px;}

.ogm-qitem{border:1px solid #e6e8ef;border-radius:10px;padding:10px 10px;margin:10px 0;background:#fff;}
.ogm-qmeta{display:flex;gap:8px;flex-wrap:wrap;font-size:11px;color:#64748b;margin-bottom:6px;}
.ogm-qmeta span{background:#f1f5f9;border:1px solid #e2e8f0;padding:2px 6px;border-radius:999px;}
.ogm-qtext{font-size:13px;line-height:1.35;color:#0f172a;margin:0 0 8px 0}
.ogm-qactions{display:flex;gap:8px;align-items:center;}
.ogm-mini{font-size:12px;border-radius:8px;border:1px solid #d7dbe7;background:#fff;padding:6px 10px;cursor:pointer;}
.ogm-mini.primary{background:#0f172a;color:#fff;border-color:#0f172a;}
.ogm-mini.danger{background:#fff;color:#b91c1c;border-color:#fecaca;}
.ogm-selected-list{list-style:none;margin:0;padding:0;}
.ogm-selected-list li{cursor:move;}
.ogm-selected-badge{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:6px;background:#0f172a;color:#fff;font-size:12px;margin-right:6px;}
.ogm-peekbox{display:none;margin-top:8px;border-top:1px dashed #e2e8f0;padding-top:8px;font-size:12px;color:#0f172a}

.ogm-preview-wrap{margin-top:18px;}
@media print { .no-print { display:none !important; } }
.ogm-tree-actions{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap;}
CSS;

  wp_add_inline_style('ogm-test-builder', $css);

  wp_localize_script('ogm-test-builder', 'OGM_TEST', [
    'ajax'  => admin_url('admin-ajax.php'),
    'nonce' => wp_create_nonce('ogm_test_builder'),
  ]);

  $js = <<<'JS'
(function($){

  function escHtml(s){
    s = String(s || '');
    return s.replace(/[&<>"']/g, function(m){
      return ({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[m]);
    });
  }

  function refreshSelectedBadges(){
    $('#ogm-selected li').each(function(i){
      $(this).find('.ogm-selected-badge').text(i+1);
    });
    var ids = $('#ogm-selected li').map(function(){ return $(this).data('id'); }).get();
    $('#ogm_selected_ids').val(ids.join(','));
  }

  function getSelectedOutcomeIds(){
    return $('.ogm-outcome-cb:checked').map(function(){ return $(this).val(); }).get();
  }

  function renderAvailable(list){
    var $box = $('#ogm-available');
    $box.empty();
    if(!list || !list.length){
      $box.append('<p class="ogm-help">Bu filtrelerde soru bulunamadı.</p>');
      return;
    }
    $.each(list, function(_, q){
      var meta = '<div class="ogm-qmeta">'
        + '<span>'+escHtml(q.ders)+'</span>'
        + '<span>'+escHtml(q.sinif)+'</span>'
        + (q.konu ? '<span>'+escHtml(q.konu)+'</span>' : '')
        + (q.outcome_id ? '<span>KZN:'+escHtml(q.outcome_id)+'</span>' : '')
        + '</div>';

      var html = ''
        + '<div class="ogm-qitem" data-id="'+q.id+'">'
        + meta
        + '<p class="ogm-qtext">'+escHtml(q.metin_kisa)+'</p>'
        + '<div class="ogm-qactions">'
        + '  <button type="button" class="ogm-mini primary ogm-add">Ekle</button>'
        + '  <button type="button" class="ogm-mini ogm-peek">Önizle</button>'
        + '</div>'
        + '<div class="ogm-peekbox"></div>'
        + '</div>';
      $box.append(html);
    });
  }

  function fetchQuestions(){
    $('#ogm_fetch').prop('disabled', true).text('Yükleniyor...');
    $.post(OGM_TEST.ajax, {
      action: 'ogm_test_fetch_questions',
      _ajax_nonce: OGM_TEST.nonce,
      ders: $('#ogm_ders').val(),
      sinif: $('#ogm_sinif').val(),
      konu: $('#ogm_konu').val(),
      adet: $('#ogm_adet').val(),
      outcome_ids: getSelectedOutcomeIds()
    }).done(function(res){
      if(res && res.success){ renderAvailable(res.data.questions); }
      else { renderAvailable([]); }
    }).fail(function(){
      renderAvailable([]);
    }).always(function(){
      $('#ogm_fetch').prop('disabled', false).text('Soruları Getir');
    });
  }

  $(document).on('click', '#ogm_fetch', fetchQuestions);

  $(document).on('click', '.ogm-add', function(){
    var $item = $(this).closest('.ogm-qitem');
    var id = $item.data('id');
    if($('#ogm-selected li[data-id="'+id+'"]').length) return;

    var meta = $item.find('.ogm-qmeta').clone();
    var text = $item.find('.ogm-qtext').text();

    var li = $('<li class="ogm-qitem"></li>').attr('data-id', id).data('id', id);
    li.append('<div><span class="ogm-selected-badge">?</span></div>');
    li.append(meta);
    li.append('<p class="ogm-qtext">'+escHtml(text)+'</p>');
    li.append('<div class="ogm-qactions">'
      + '<button type="button" class="ogm-mini danger ogm-remove">Çıkar</button>'
      + '<button type="button" class="ogm-mini ogm-peek">Önizle</button>'
      + '</div>'
      + '<div class="ogm-peekbox"></div>'
    );

    $('#ogm-selected').append(li);
    refreshSelectedBadges();
  });

  $(document).on('click', '.ogm-remove', function(){
    $(this).closest('li').remove();
    refreshSelectedBadges();
  });

  $(document).on('click', '.ogm-peek', function(){
    var $wrap = $(this).closest('.ogm-qitem');
    var id = $wrap.data('id');
    var $box = $wrap.find('.ogm-peekbox');

    if($box.is(':visible')){ $box.hide().empty(); return; }
    $box.html('Yükleniyor...').show();

    $.post(OGM_TEST.ajax, { action:'ogm_test_get_question', _ajax_nonce:OGM_TEST.nonce, id:id })
      .done(function(res){
        if(res && res.success){
          var q = res.data;
          var html = '<div style="white-space:pre-wrap;">'+escHtml(q.metin)+'</div>';
          if(q.a||q.b||q.c||q.d||q.e){
            html += '<div style="margin-top:8px">'
              + (q.a ? '<div>A) '+escHtml(q.a)+'</div>' : '')
              + (q.b ? '<div>B) '+escHtml(q.b)+'</div>' : '')
              + (q.c ? '<div>C) '+escHtml(q.c)+'</div>' : '')
              + (q.d ? '<div>D) '+escHtml(q.d)+'</div>' : '')
              + (q.e ? '<div>E) '+escHtml(q.e)+'</div>' : '')
              + '</div>';
          }
          $box.html(html);
        } else {
          $box.html('Önizleme alınamadı.');
        }
      }).fail(function(){ $box.html('Önizleme alınamadı.'); });
  });

  $(function(){
    $('#ogm-selected').sortable({ update:function(){ refreshSelectedBadges(); } });
  });

  // Testi Hazırla: print şablonuna gider
  $(document).on('click', '#ogm_build', function(){
    var ids = $('#ogm_selected_ids').val();
    if(!ids){ alert('Önce sağ tarafa soru ekle.'); return; }

    var url = window.location.href;
    url = url.replace(/([?&])print=1\b/g, '$1');
    url = url.replace(/[?&]ids=[^&]*/g, '');
    url = url.replace(/[?&]ders=[^&]*/g, '');
    url = url.replace(/[?&]sinif=[^&]*/g, '');
    url = url.replace(/[?&]konu=[^&]*/g, '');
    url = url.replace(/[?&]test_adi=[^&]*/g, '');

    var glue = (url.indexOf('?') === -1) ? '?' : '&';
    url = url + glue
      + 'print=1'
      + '&ids=' + encodeURIComponent(ids)
      + '&ders=' + encodeURIComponent($('#ogm_ders').val() || '')
      + '&sinif=' + encodeURIComponent($('#ogm_sinif').val() || '')
      + '&konu=' + encodeURIComponent($('#ogm_konu').val() || '')
      + '&test_adi=' + encodeURIComponent($('#ogm_test_adi').val() || '');

    window.location.href = url;
  });

  $(document).on('click', '#ogm_print', function(){ window.print(); });

  // ------- TREE -------
  function setBC(){
    var c = $('#ogm_class').val();
    var s = $('#ogm_subject').val();
    if(!c || !s){ $('#ogm-tree-bc').hide(); return; }
    $('#ogm-tree-bc').text(c + '. Sınıf / ' + s + ' – Üniteler').show();
  }

  function loadClasses(){
    $('#ogm_class').prop('disabled', true);
    $.post(OGM_TEST.ajax, { action:'ogm_kzn_get_classes', _ajax_nonce: OGM_TEST.nonce })
      .done(function(res){
        if(res && res.success){
          var $c = $('#ogm_class');
          $c.empty().append('<option value="">Sınıf seç</option>');
          $.each(res.data.classes || [], function(_, v){
            $c.append('<option value="'+escHtml(v)+'">'+escHtml(v)+'. Sınıf</option>');
          });
        }
      })
      .always(function(){ $('#ogm_class').prop('disabled', false); });
  }

  function loadSubjects(classId){
    var $s = $('#ogm_subject');
    $s.prop('disabled', true).empty().append('<option value="">Ders seç</option>');
    $('#ogm-tree').html('<div class="ogm-help">Ders seçince ağaç gelir.</div>');
    setBC();
    if(!classId){ $s.prop('disabled', false); return; }

    $.post(OGM_TEST.ajax, { action:'ogm_kzn_get_subjects', _ajax_nonce: OGM_TEST.nonce, class_id: classId })
      .done(function(res){
        if(res && res.success){
          $.each(res.data.subjects || [], function(_, it){
            $s.append('<option value="'+escHtml(it.code)+'">'+escHtml(it.label)+'</option>');
          });
        }
      })
      .always(function(){ $s.prop('disabled', false); });
  }

  function updateTreeSelectedCount(){
    var n = $('.ogm-outcome-cb:checked').length;
    var $badge = $('#ogm-tree-selected-count');
    if(!$badge.length) return;
    $badge.text(n + ' kazanım seçildi');
  }

  function renderNodes($ul, nodes){
    var classId = $('#ogm_class').val();

    $.each(nodes || [], function(_, n){
      ifgý: void 0;

      if(n.node_type !== 'outcome' && String(n.kzn_code) === String(classId)) return;

      var isOutcome = (n.node_type === 'outcome');
      var title = n.title ? n.title : n.kzn_code;

      if(!isOutcome && String(n.kzn_code).split('.').length === 2){
        title = n.kzn_code.split('.')[1] + '. ÜNİTE: ' + String(title).toUpperCase();
      }

      var $li = $('<li class="ogm-node"></li>');

      if(isOutcome){
        $li.append(
          '<div class="ogm-node-top"><div>'
          + '<label><input type="checkbox" class="ogm-outcome-cb" value="'+escHtml(n.id)+'"> '
          + '<span>'+escHtml(title)+'</span></label> '
          + '<button type="button" class="button button-small ogm-genq" data-outcome-id="'+escHtml(n.id)+'" data-kzn="'+escHtml(n.kzn_code)+'">Soru Üret</button>'
          + '<div class="ogm-node-sub">'+escHtml(n.kzn_code)+'</div>'
          + '</div></div>'
        );
      } else {
        $li.append(
          '<div class="ogm-node-top"><div>'
          + '<button type="button" class="ogm-node-toggle" data-kzn="'+escHtml(n.kzn_code)+'">'
          + '<span class="ogm-chev">▶</span><strong>'+escHtml(title)+'</strong></button>'
          + '<div class="ogm-node-sub">'+escHtml(n.kzn_code)+'</div>'
          + '</div></div>'
          + '<div class="ogm-node-children"></div>'
        );
      }

      $ul.append($li);
    });

    updateTreeSelectedCount();
  }

  function loadRoot(classId, subjectCode){
    setBC();
    if(!classId || !subjectCode){
      $('#ogm-tree').html('<div class="ogm-help">Sınıf ve ders seçince kazanım ağacı gelir.</div>');
      updateTreeSelectedCount();
      return;
    }

    $('#ogm-tree').html('<div class="ogm-help">Yükleniyor...</div>');

    $.post(OGM_TEST.ajax, {
      action:'ogm_kzn_get_children',
      _ajax_nonce: OGM_TEST.nonce,
      class_id: classId,
      subject_code: subjectCode,
      parent_kzn_code: ''
    }).done(function(res){
      if(res && res.success){
        var nodes = res.data.nodes || [];

        if(nodes.length === 1 && String(nodes[0].kzn_code) === String(classId)){
          $.post(OGM_TEST.ajax, {
            action:'ogm_kzn_get_children',
            _ajax_nonce: OGM_TEST.nonce,
            class_id: classId,
            subject_code: subjectCode,
            parent_kzn_code: nodes[0].kzn_code
          }).done(function(res2){
            var $ul2 = $('<ul class="ogm-tree"></ul>');
            renderNodes($ul2, (res2 && res2.success) ? (res2.data.nodes||[]) : []);
            $('#ogm-tree').empty().append($ul2);
          }).fail(function(){
            $('#ogm-tree').html('<div class="ogm-help">Ağaç alınamadı.</div>');
            updateTreeSelectedCount();
          });
          return;
        }

        var $ul = $('<ul class="ogm-tree"></ul>');
        renderNodes($ul, nodes);
        $('#ogm-tree').empty().append($ul);
      } else {
        $('#ogm-tree').html('<div class="ogm-help">Ağaç bulunamadı.</div>');
        updateTreeSelectedCount();
      }
    }).fail(function(){
      $('#ogm-tree').html('<div class="ogm-help">Ağaç alınamadı.</div>');
      updateTreeSelectedCount();
    });
  }

  $(document).on('change', '#ogm_class', function(){
    var classId = $(this).val();
    $('#ogm_sinif').val(classId ? (classId + '. Sınıf') : '');
    loadSubjects(classId);
    updateTreeSelectedCount();
  });

  $(document).on('change', '#ogm_subject', function(){
    var classId = $('#ogm_class').val();
    var sub = $(this).val();
    $('#ogm_ders').val(sub || '');
    loadRoot(classId, sub);
  });

  $(document).on('click', '.ogm-node-toggle', function(){
    var $btn = $(this);
    var parent = $btn.data('kzn');
    var $node = $btn.closest('.ogm-node');
    var $children = $node.find('.ogm-node-children');
    var classId = $('#ogm_class').val();
    var sub = $('#ogm_subject').val();

    if($children.is(':visible')){
      $children.slideUp(120);
      $node.removeClass('is-open');
      return;
    }

    $node.addClass('is-open');

    if($children.data('loaded')){
      $children.slideDown(120);
      return;
    }

    $btn.prop('disabled', true);

    $.post(OGM_TEST.ajax, {
      action:'ogm_kzn_get_children',
      _ajax_nonce: OGM_TEST.nonce,
      class_id: classId,
      subject_code: sub,
      parent_kzn_code: parent
    }).done(function(res){
      var $ul = $('<ul class="ogm-tree"></ul>');
      renderNodes($ul, (res && res.success) ? (res.data.nodes || []) : []);
      $children.empty().append($ul).data('loaded', true).slideDown(120);
    }).fail(function(){
      $children.html('<div class="ogm-help">Alt düğüm alınamadı.</div>').data('loaded', true).slideDown(120);
    }).always(function(){
      $btn.prop('disabled', false);
    });
  });

  $(document).on('change', '.ogm-outcome-cb', updateTreeSelectedCount);
  $(document).on('click', '#ogm_fetch_tree', function(){ $('#ogm_fetch').trigger('click'); });

  loadClasses();
  $('#ogm-tree').html('<div class="ogm-help">Sınıf ve ders seçince ünite/kazanım ağacı gelir.</div>');
  updateTreeSelectedCount();

})(jQuery);
JS;

  wp_add_inline_script('ogm-test-builder', $js, 'after');
}, 20);

add_shortcode('ogm_test_olustur', function () {
  ob_start(); ?>
  <div class="ogm-wrap">
    <div class="ogm-topbar no-print">
      <div class="ogm-field">
        <label>Test Adı</label>
        <input id="ogm_test_adi" type="text" placeholder="Örn: AYT – Sosyal Bilimler (10 Soru)">
      </div>
      <div class="ogm-field">
        <label>Ders (otomatik dolar)</label>
        <input id="ogm_ders" type="text" readonly placeholder="FEN / MAT / ...">
      </div>
      <div class="ogm-field">
        <label>Sınıf (otomatik dolar)</label>
        <input id="ogm_sinif" type="text" readonly placeholder="7. Sınıf">
      </div>
      <div class="ogm-field">
        <label>Konu (opsiyonel)</label>
        <input id="ogm_konu" type="text" placeholder="">
      </div>
      <div class="ogm-field" style="max-width:120px">
        <label>Adet</label>
        <input id="ogm_adet" type="number" min="1" max="50" value="10">
      </div>
      <div class="ogm-actions">
        <button type="button" class="ogm-btn secondary" id="ogm_fetch">Soruları Getir</button>
        <button type="button" class="ogm-btn" id="ogm_build">Testi Hazırla</button>
        <button type="button" class="ogm-btn secondary" id="ogm_print">Yazdır</button>
      </div>
    </div>

    <div class="ogm-tree-wrap no-print">
      <div class="ogm-tree-head">
        <div class="ogm-field" style="max-width:180px">
          <label>Sınıf</label>
          <select id="ogm_class"><option value="">Sınıf seç</option></select>
        </div>
        <div class="ogm-field" style="max-width:260px">
          <label>Ders</label>
          <select id="ogm_subject" disabled><option value="">Ders seç</option></select>
        </div>
        <span id="ogm-tree-bc" class="ogm-breadcrumb"></span>
        <span class="ogm-help">Kazanım seçersen “Soruları Getir” kazanıma göre filtreler.</span>
        <div class="ogm-tree-actions">
          <span id="ogm-tree-selected-count" class="ogm-breadcrumb" style="display:inline-block;">0 kazanım seçildi</span>
          <button type="button" class="ogm-btn secondary" id="ogm_fetch_tree">Soruları Getir</button>
        </div>
      </div>
      <div id="ogm-tree"><div class="ogm-help">Sınıf ve ders seçince ünite/kazanım ağacı gelir.</div></div>
    </div>

    <div class="ogm-grid no-print">
      <div class="ogm-panel">
        <h3>Sol: Havuz (Filtreye göre)</h3>
        <div class="ogm-body">
          <p class="ogm-help">“Soruları Getir” ile listeyi doldur. Beğendiğini sağ tarafa ekle.</p>
          <div id="ogm-available"></div>
        </div>
      </div>

      <div class="ogm-panel">
        <h3>Sağ: Seçilen Sorular (Sürükleyerek Sırala)</h3>
        <div class="ogm-body">
          <p class="ogm-help">Sürükle-bırak ile sıra değiştir. “Testi Hazırla” ile şablonlu çıktıya geçer.</p>
          <ul id="ogm-selected" class="ogm-selected-list"></ul>
          <input type="hidden" id="ogm_selected_ids" value="">
        </div>
      </div>
    </div>

    <div class="ogm-preview-wrap">
      <div id="ogm-preview"></div>
    </div>
  </div>
  <?php
  return ob_get_clean();
});
```
