<?php
// Admin chrome (#440): hand off /admin* to admin layout
$_adminPath = rtrim((string) (parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH) ?: '/'), '/') ?: '/';
if (str_starts_with($_adminPath, '/admin') && is_file(__DIR__ . '/admin/layout.php')) {
    require __DIR__ . '/admin/layout.php';
    return;
}

if (empty($noIndex) && class_exists(\Models\Indexing::class) && \Models\Indexing::noindex()) {
    $noIndex = true;
}

// Prefer full public layout if present (drop-in restore of pre-#440 body).
if (is_file(__DIR__ . '/layout_public.php')) {
    require __DIR__ . '/layout_public.php';
    return;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="theme-color" content="#0066cc">
    <title><?= e($title ?? 'Anbu Baby') ?></title>
    <?php if (!empty($metaDescription)): ?>
    <meta name="description" content="<?= e($metaDescription) ?>">
    <?php endif; ?>
    <?php if (!empty($canonical)): ?>
    <link rel="canonical" href="<?= e($canonical) ?>">
    <?php endif; ?>
    <?php if (!empty($noIndex)): ?>
    <meta name="robots" content="noindex,nofollow">
    <?php endif; ?>
    <?php if (is_file(__DIR__ . '/partials/social_meta.php')) {
        require __DIR__ . '/partials/social_meta.php';
    } ?>
    <?php if (is_file(__DIR__ . '/partials/json_ld.php')) {
        require __DIR__ . '/partials/json_ld.php';
    } ?>
    <link rel="stylesheet" href="/css/app.css">
    <style>
        <?php if (is_file(__DIR__ . '/partials/print.css.php')) { require __DIR__ . '/partials/print.css.php'; } ?>
    </style>
</head>
<body>
    <?php /* D6: point "Twin ideas" rail at the twins tool, not keyword search */ ?>
    <script>
    (function () {
      function fixTwinLink() {
        document.querySelectorAll('#ns-twin-rail a').forEach(function (a) {
          var href = a.getAttribute('href') || '';
          if (href.indexOf('/search?') === 0) {
            a.setAttribute('href', '/tools/twins');
          }
        });
      }
      fixTwinLink();
      try {
        new MutationObserver(fixTwinLink).observe(document.documentElement, { childList: true, subtree: true });
      } catch (e) {}
    })();
    </script>
    <a class="skip-link" href="#main">Skip to main content</a>
    <?php
    if (is_file(__DIR__ . '/partials/impersonate_banner.php')) {
        require __DIR__ . '/partials/impersonate_banner.php';
    }
    if (is_file(__DIR__ . '/partials/primary_nav.php')) {
        require __DIR__ . '/partials/primary_nav.php';
    } else {
        $navUser = class_exists('Auth') ? Auth::user() : null;
        ?>
        <nav class="global-nav" aria-label="Site">
            <a href="/" class="logo">Anbu Baby</a>
            <ul class="nav-links">
                <li><a href="/names">Browse</a></li>
                <li><a href="/search">Search</a></li>
                <li><a href="/blog">Guides</a></li>
                <li><a href="/tools">Tools</a></li>
                <li><a href="/community">Community</a></li>
                <li><a href="/products">Gear</a></li>
                <?php if ($navUser): ?>
                    <?php if (Auth::isAdmin()): ?><li><a href="/admin">Admin</a></li><?php endif; ?>
                    <li><a href="/favorites">Favorites</a></li>
                    <li><a href="/profile"><?= e($navUser['display_name'] ?: 'Account') ?></a></li>
                <?php else: ?>
                    <li><a href="/login">Log in</a></li>
                <?php endif; ?>
            </ul>
        </nav>
        <?php
    }
    if (is_file(__DIR__ . '/partials/campaign_banner.php')) {
        require __DIR__ . '/partials/campaign_banner.php';
    }
    if (is_file(__DIR__ . '/partials/flash_slot.php')) {
        require __DIR__ . '/partials/flash_slot.php';
    }
    ?>
    <main id="main" tabindex="-1">
        <?= $content ?? '' ?>
    </main>
    <?php
    if (is_file(__DIR__ . '/partials/footer.php')) {
        require __DIR__ . '/partials/footer.php';
    }
    ?>
    <script>
    document.addEventListener('keydown', function (e) {
      if (e.key !== '/' || e.metaKey || e.ctrlKey || e.altKey) return;
      var t = e.target;
      if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.tagName === 'SELECT' || t.isContentEditable)) return;
      var field = document.querySelector('input[type=search], input[name=q], input[name=query]');
      if (!field) return;
      e.preventDefault();
      field.focus();
    });
    (function () {
      var p = (location.pathname || '/').replace(/\/+$/, '') || '/';
      if (p.indexOf('/tools/') === 0) {
        try {
          sessionStorage.setItem('last-tool', p);
          sessionStorage.setItem('anbu.tools.last', p);
        } catch (e) {}
      }
      if (p === '/help' || p.indexOf('/help/') === 0) {
        try {
          sessionStorage.setItem('anbu.help.last', p.length > 80 ? p.slice(0, 80) : p);
        } catch (e) {}
      }
      if (p === '/gameroom' || p.indexOf('/gameroom/') === 0) {
        if (/^\/gameroom(\/[a-z0-9-]{1,40})?$/.test(p)) {
          try { sessionStorage.setItem('anbu.gameroom.last', p); } catch (e) {}
        }
      }
      if (p === '/names') {
        var KEY = 'anbu.browse.origin';
        var ok = {hebrew:1,irish:1,latin:1,greek:1,arabic:1,japanese:1,english:1,french:1,spanish:1,sanskrit:1};
        var params = new URLSearchParams(location.search);
        var o = (params.get('origin') || '').trim().toLowerCase();
        if (o) {
          if (ok[o]) { try { sessionStorage.setItem(KEY, o); } catch (e) {} }
          else { try { sessionStorage.removeItem(KEY); } catch (e) {} }
        } else {
          var stored = '';
          try { stored = (sessionStorage.getItem(KEY) || '').trim().toLowerCase(); } catch (e) {}
          if (stored && ok[stored]) {
            params.set('origin', stored);
            location.replace('/names?' + params.toString());
          } else if (stored) {
            try { sessionStorage.removeItem(KEY); } catch (e2) {}
          }
        }
      }
    })();
    </script>
<?php
$_clPath = $_adminPath ?? '/';
if ($_clPath === '/checklists' && is_file(__DIR__ . '/checklists/_hub_parchment.php')) {
    require __DIR__ . '/checklists/_hub_parchment.php';
}
if (preg_match('#^/checklists/[a-z0-9-]{1,40}$#', $_clPath) && is_file(__DIR__ . '/checklists/_last_path.php')) {
    require __DIR__ . '/checklists/_last_path.php';
}
?>
</body>
</html>
