<?php
// public/article.php — one article: summary, cleaned body, a clear link to the original, related stories.
require_once __DIR__ . '/includes/api.php';

$id  = (int) ($_GET['id'] ?? 0);
$art = $id ? api_article($id) : null;

if (!$art) {
    http_response_code(404);
    $meta = ['title' => t('p.not_found'), 'noindex' => true];
    $activePage = 'article';
    require_once __DIR__ . '/includes/header.php';
    echo '<main id="main" class="wrap"><div class="empty-state"><h1>' . e(t('p.not_found')) . '</h1><p>' . e(t('p.not_found_text'))
       . '</p><p><a class="btn-line" href="' . e(url('public/index.php')) . '">' . e(t('p.home')) . '</a></p></div></main>';
    require_once __DIR__ . '/includes/footer.php';
    exit;
}

count_view($id);

$related = api_news(['category' => $art['category'], 'limit' => 4, 'exclude' => $id]);
if (count($related) < 4) {
    $more = api_news(['limit' => 4 - count($related), 'exclude' => $id]);
    $have = array_column($related, 'id');
    foreach ($more as $m) if (!in_array($m['id'], $have, true)) $related[] = $m;
}

// Body: sanitised HTML if we have a real body; otherwise the summary is all there is.
$bodyHtml  = HtmlSanitizer::clean($art['content'] ?? '', $art['url']);
$bodyText  = trim(strip_tags($bodyHtml));
$summary   = trim((string) $art['description']);
$hasBody   = mb_strlen($bodyText) > 300;
if (!$hasBody && $summary === '' && $bodyText !== '') { $summary = truncate($bodyText, 300); }

$heroImg = $art['images'][0] ?? null;
$heroUrl = $heroImg ? (media_url($heroImg['file_url']) ?: $heroImg['original_url']) : '';
$ts      = display_ts($art);
$srcHost = parse_url($art['url'], PHP_URL_HOST) ?: $art['url'];
$canon   = abs_url('public/article.php?id=' . $id);

$meta = [
    'title'       => $art['title'],
    'description' => $summary !== '' ? $summary : $bodyText,
    'image'       => $heroUrl,
    'type'        => 'article',
    'published'   => date('Y-m-d H:i:s', $ts),
    'section'     => cat_label($art['category']),
    'canonical'   => $canon,
    'rss_cat'     => $art['category'],
    'jsonld'      => [[
        '@context' => 'https://schema.org', '@type' => 'NewsArticle',
        'headline' => mb_substr($art['title'], 0, 110), 'url' => $canon,
        'mainEntityOfPage' => $canon, 'inLanguage' => preg_match('/\p{Arabic}/u', $art['title']) ? 'ar' : I18n::lang(),
        'datePublished' => date('c', $ts), 'dateModified' => date('c', strtotime($art['created_at'])),
        'articleSection' => cat_label($art['category']),
        'image' => $heroUrl ? [abs_url_if_relative($heroUrl)] : null,
        'description' => truncate($summary, 200),
        'author' => ['@type' => 'Organization', 'name' => $art['source_name'] ?: $srcHost],
        'publisher' => ['@type' => 'Organization', 'name' => Settings::get('site_name', 'NewsForge')],
        'isBasedOn' => $art['url'],
    ], [
        '@context' => 'https://schema.org', '@type' => 'BreadcrumbList',
        'itemListElement' => [
            ['@type' => 'ListItem', 'position' => 1, 'name' => t('p.home'), 'item' => abs_url('public/index.php')],
            ['@type' => 'ListItem', 'position' => 2, 'name' => cat_label($art['category']), 'item' => abs_url('public/category.php?cat=' . urlencode($art['category']))],
            ['@type' => 'ListItem', 'position' => 3, 'name' => mb_substr($art['title'], 0, 80)],
        ],
    ]],
];
$meta['jsonld'][0] = array_filter($meta['jsonld'][0], fn($v) => $v !== null);

$activePage = 'article';
require_once __DIR__ . '/includes/header.php';

$shareUrl   = rawurlencode($canon);
$shareTitle = rawurlencode($art['title']);
?>
<main id="main" class="wrap">
  <div class="with-side">
    <article class="article" itemscope itemtype="https://schema.org/NewsArticle">
      <nav class="crumbs" aria-label="<?= e(t('p.breadcrumb')) ?>">
        <a href="<?= e(url('public/index.php')) ?>"><?= e(t('p.home')) ?></a>
        <a href="<?= e(category_url($art['category'])) ?>"><?= e(cat_label($art['category'])) ?></a>
      </nav>

      <h1 class="article-title" dir="auto" itemprop="headline"><?= e($art['title']) ?></h1>

      <div class="meta article-meta">
        <?= source_chip($art['source_name'] ?: $srcHost) ?>
        <time datetime="<?= e(date('c', $ts)) ?>" itemprop="datePublished"><?= e(format_date(date('Y-m-d H:i:s', $ts), true)) ?></time>
        <?php if ($hasBody): ?><span><?= e(t('p.read_time', read_time($bodyText))) ?></span><?php endif; ?>
        <span><?= e(t('p.views_n', number_format((int) $art['views'] + 1))) ?></span>
      </div>

      <?php if ($heroUrl): ?>
        <figure class="hero-fig"><img src="<?= e($heroUrl) ?>" alt="" decoding="async" fetchpriority="high" onerror="this.closest('figure').remove()"></figure>
      <?php endif; ?>

      <?php if ($summary !== ''): ?><p class="article-lead" dir="auto" itemprop="description"><?= e($summary) ?></p><?php endif; ?>

      <?php if ($hasBody): ?>
        <div class="article-body" dir="auto" itemprop="articleBody"><?= $bodyHtml ?></div>
      <?php else: ?>
        <div class="article-body" hidden></div>
      <?php endif; ?>

      <?php foreach ($art['videos'] as $vid): $vu = media_url($vid['file_url']); if (!$vu) continue; ?>
        <video class="article-video" controls preload="metadata" src="<?= e($vu) ?>"></video>
      <?php endforeach; ?>

      <aside class="origin" aria-label="<?= e(t('p.original')) ?>">
        <div>
          <strong><?= e($hasBody ? t('p.original_title') : t('p.original_title_short')) ?></strong>
          <span><?= e(t('p.original_text', $art['source_name'] ?: $srcHost)) ?></span>
        </div>
        <a class="btn-solid" href="<?= e($art['url']) ?>" target="_blank" rel="noopener nofollow"><?= e(t('p.read_at', $art['source_name'] ?: $srcHost)) ?></a>
      </aside>

      <div class="share" role="group" aria-label="<?= e(t('p.share')) ?>">
        <span class="share-h"><?= e(t('p.share')) ?></span>
        <a href="https://wa.me/?text=<?= $shareTitle ?>%20<?= $shareUrl ?>" target="_blank" rel="noopener">WhatsApp</a>
        <a href="https://t.me/share/url?url=<?= $shareUrl ?>&amp;text=<?= $shareTitle ?>" target="_blank" rel="noopener">Telegram</a>
        <a href="https://twitter.com/intent/tweet?url=<?= $shareUrl ?>&amp;text=<?= $shareTitle ?>" target="_blank" rel="noopener">X</a>
        <a href="https://www.facebook.com/sharer/sharer.php?u=<?= $shareUrl ?>" target="_blank" rel="noopener">Facebook</a>
        <button type="button" data-share="copy" data-url="<?= e($canon) ?>"><?= e(t('p.copy_link')) ?></button>
        <button type="button" data-share="native" data-url="<?= e($canon) ?>" data-title="<?= e($art['title']) ?>" hidden><?= e(t('p.share_more')) ?></button>
      </div>
    </article>

    <?php require __DIR__ . '/includes/sidebar.php'; ?>
  </div>

  <?php if ($related): ?>
  <section class="band" aria-labelledby="rel-h">
    <header class="band-head"><h2 id="rel-h"><?= e(t('p.related')) ?></h2></header>
    <div class="related">
      <?php foreach ($related as $a): ?>
        <article class="rel-card">
          <a class="card-media" href="<?= e(article_url($a)) ?>" tabindex="-1" aria-hidden="true"><?= card_media($a, 'rel-img') ?></a>
          <h3 dir="auto"><a href="<?= e(article_url($a)) ?>"><?= e($a['title']) ?></a></h3>
          <div class="meta"><?= source_chip($a['source_name']) ?><time datetime="<?= e(date('c', display_ts($a))) ?>"><?= e(rel_time(display_time($a))) ?></time></div>
        </article>
      <?php endforeach; ?>
    </div>
  </section>
  <?php endif; ?>
</main>
<?php require_once __DIR__ . '/includes/footer.php'; ?>
