<?php
/**
 * SeoAIu 动态 Sitemap 生成器
 * 每次访问实时从数据库读取最新内容生成 XML Sitemap
 *
 * 关键说明：
 *   - 工具分类从 categories + featured_categories 两个表合并（slug 去重）
 *   - 工具从 tools + featured_tools 两个表合并（slug 去重）
 *   - 文章从 articles 表
 *   - 文章分类从 article_categories 表
 *   - 所有 slug 经过严格格式检查，避免旧 UUID 格式脏数据生成无效 404 链接
 *   - 过滤规则与 category.php / article.php 完全一致
 */

require_once 'config.php';

header('Content-Type: application/xml; charset=utf-8');

$conn = getDB();
$baseUrl = rtrim(defined('SITE_URL') ? SITE_URL : 'https://seoaiu.com', '/');
$ITEMS_PER_PAGE = 12;

// ===== 核心数组
$urls = [];
$seenLocs = [];

// ========== 工具函数 ==========

/**
 * 添加 URL 到 sitemap（按 loc 去重）
 */
function addUrl($loc, $lastmod, $changefreq, $priority) {
    global $urls, $seenLocs;
    if (in_array($loc, $seenLocs)) return;
    $seenLocs[] = $loc;
    $urls[] = [
        'loc' => $loc,
        'lastmod' => $lastmod,
        'changefreq' => $changefreq,
        'priority' => $priority
    ];
}

/**
 * 判断 slug 是否有效（与 category.php / article.php 完全一致的规则）
 * 无效情况：
 *   - 空字符串 / 空白
 *   - 10 位以上纯十六进制字符（如 UUID 片段 6a16a431524d9）
 *   - ai- + 10位以上十六进制（即 ai-6a16a431524d9）
 *   - 仅含数字
 */
function isValidSlug($slug) {
    $slug = trim($slug ?? '');
    if (empty($slug)) return false;
    $slugLower = strtolower($slug);
    // 10位以上纯十六进制字符 → 脏数据（如 UUID 片段）
    if (preg_match('/^[a-f0-9]{10,}$/', $slugLower)) return false;
    // ai- + 10位以上十六进制 → 旧的脏数据格式
    if (preg_match('/^ai-[a-f0-9]{10,}$/', $slugLower)) return false;
    return true;
}

// ========== 1. 固定页面 ==========
addUrl($baseUrl . '/', date('Y-m-d'), 'daily', '1.0');
addUrl($baseUrl . '/about.html', date('Y-m-d'), 'monthly', '0.6');
addUrl($baseUrl . '/privacy.html', date('Y-m-d'), 'monthly', '0.4');
addUrl($baseUrl . '/articles.html', date('Y-m-d'), 'daily', '0.9');
addUrl($baseUrl . '/category.html', date('Y-m-d'), 'daily', '0.8');
addUrl($baseUrl . '/search.html', date('Y-m-d'), 'weekly', '0.5');

// ========== 2. 工具分页（/category.html?page=N）从 page=2 开始 ==========
$totalToolsCount = 0;
$totalCountResult = @mysqli_query($conn, "SELECT COUNT(*) as cnt FROM tools WHERE (is_published = 1 OR is_published IS NULL)");
if ($totalCountResult && $row = mysqli_fetch_assoc($totalCountResult)) {
    $totalToolsCount = intval($row['cnt']);
}
$totalToolsPages = max(1, ceil($totalToolsCount / $ITEMS_PER_PAGE));
for ($page = 2; $page <= $totalToolsPages; $page++) {
    addUrl($baseUrl . '/category.html?page=' . $page, date('Y-m-d'), 'daily', '0.5');
}

// ========== 3. 文章分页（/articles.html?page=N）从 page=2 开始 ==========
$totalArticlesCount = 0;
$totalArtCountResult = @mysqli_query($conn, "SELECT COUNT(*) as cnt FROM articles WHERE (is_published = 1 OR is_published IS NULL)");
if ($totalArtCountResult && $row = mysqli_fetch_assoc($totalArtCountResult)) {
    $totalArticlesCount = intval($row['cnt']);
}
$totalArticlesPages = max(1, ceil($totalArticlesCount / $ITEMS_PER_PAGE));
for ($page = 2; $page <= $totalArticlesPages; $page++) {
    addUrl($baseUrl . '/articles.html?page=' . $page, date('Y-m-d'), 'daily', '0.5');
}

// ========== 4. 工具详情页（tools + featured_tools） ==========
$seenToolSlugs = [];

// 4.1 普通工具
$toolsResult = @mysqli_query($conn, "SELECT slug, COALESCE(updated_at, created_at) as lastmod FROM tools WHERE (is_published = 1 OR is_published IS NULL) ORDER BY COALESCE(updated_at, created_at) DESC");
if ($toolsResult) {
    while ($tool = mysqli_fetch_assoc($toolsResult)) {
        $slug = trim($tool['slug'] ?? '');
        if (!isValidSlug($slug)) continue;
        if (in_array($slug, $seenToolSlugs)) continue;
        $seenToolSlugs[] = $slug;
        addUrl(
            $baseUrl . '/tool-detail/' . htmlspecialchars($slug, ENT_XML1, 'UTF-8') . '.html',
            date('Y-m-d', strtotime($tool['lastmod'])),
            'weekly',
            '0.7'
        );
    }
    mysqli_free_result($toolsResult);
}

// 4.2 推荐工具（去重，与 tools 合并）
$ftResult = @mysqli_query($conn, "SELECT slug, COALESCE(updated_at, created_at) as lastmod FROM featured_tools WHERE (is_published = 1 OR is_published IS NULL) ORDER BY COALESCE(updated_at, created_at) DESC");
if ($ftResult) {
    while ($tool = mysqli_fetch_assoc($ftResult)) {
        $slug = trim($tool['slug'] ?? '');
        if (!isValidSlug($slug)) continue;
        if (in_array($slug, $seenToolSlugs)) continue;
        $seenToolSlugs[] = $slug;
        addUrl(
            $baseUrl . '/tool-detail/' . htmlspecialchars($slug, ENT_XML1, 'UTF-8') . '.html',
            date('Y-m-d', strtotime($tool['lastmod'])),
            'weekly',
            '0.7'
        );
    }
    mysqli_free_result($ftResult);
}

// ========== 5. 工具分类页（categories + featured_categories） ==========
$seenCatSlugs = [];

// 5.1 categories 表（普通工具分类，这是用户后台"普通工具"所在的分类表）
$catResult1 = @mysqli_query($conn, "SELECT slug, COALESCE(updated_at, created_at) as lastmod FROM categories WHERE slug IS NOT NULL AND slug != '' ORDER BY COALESCE(updated_at, created_at) DESC");
if ($catResult1) {
    while ($cat = mysqli_fetch_assoc($catResult1)) {
        $slug = trim($cat['slug'] ?? '');
        if (!isValidSlug($slug)) continue;
        if (in_array($slug, $seenCatSlugs)) continue;
        $seenCatSlugs[] = $slug;
        addUrl(
            $baseUrl . '/category/' . htmlspecialchars($slug, ENT_XML1, 'UTF-8') . '.html',
            date('Y-m-d', strtotime($cat['lastmod'] ?? 'now')),
            'daily',
            '0.8'
        );
    }
    mysqli_free_result($catResult1);
}

// 5.2 featured_categories 表（推荐工具分类，新增表，与 categories 去重）
$catResult2 = @mysqli_query($conn, "SELECT slug, COALESCE(updated_at, created_at) as lastmod FROM featured_categories WHERE slug IS NOT NULL AND slug != '' ORDER BY COALESCE(updated_at, created_at) DESC");
// 如果上面 COALESCE 查询失败（例如 updated_at 字段不存在于老表），回退到只用 created_at
if (!$catResult2) {
    $catResult2 = @mysqli_query($conn, "SELECT slug, created_at as lastmod FROM featured_categories WHERE slug IS NOT NULL AND slug != '' ORDER BY created_at DESC");
}
if (!$catResult2) {
    $catResult2 = @mysqli_query($conn, "SELECT slug, created_at as lastmod FROM featured_categories WHERE slug IS NOT NULL AND slug != '' ORDER BY id ASC");
}
if ($catResult2) {
    while ($cat = mysqli_fetch_assoc($catResult2)) {
        $slug = trim($cat['slug'] ?? '');
        if (!isValidSlug($slug)) continue;
        if (in_array($slug, $seenCatSlugs)) continue;
        $seenCatSlugs[] = $slug;
        addUrl(
            $baseUrl . '/category/' . htmlspecialchars($slug, ENT_XML1, 'UTF-8') . '.html',
            date('Y-m-d', strtotime($cat['lastmod'] ?? 'now')),
            'daily',
            '0.8'
        );
    }
    mysqli_free_result($catResult2);
}

// ========== 6. 文章详情页 ==========
$articlesResult = @mysqli_query($conn, "SELECT slug, COALESCE(updated_at, created_at) as lastmod FROM articles WHERE (is_published = 1 OR is_published IS NULL) ORDER BY COALESCE(updated_at, created_at) DESC");
if ($articlesResult) {
    while ($article = mysqli_fetch_assoc($articlesResult)) {
        $slug = trim($article['slug'] ?? '');
        if (!isValidSlug($slug)) continue;
        addUrl(
            $baseUrl . '/article/' . htmlspecialchars($slug, ENT_XML1, 'UTF-8') . '.html',
            date('Y-m-d', strtotime($article['lastmod'])),
            'weekly',
            '0.7'
        );
    }
    mysqli_free_result($articlesResult);
}

// ========== 7. 文章分类页（article_categories） ==========
$articleCatResult = @mysqli_query($conn, "SELECT slug, COALESCE(updated_at, created_at) as lastmod FROM article_categories WHERE slug IS NOT NULL AND slug != '' ORDER BY COALESCE(updated_at, created_at) DESC");
if (!$articleCatResult) {
    // 容错：如果没有 updated_at 或查询失败，用 created_at
    $articleCatResult = @mysqli_query($conn, "SELECT slug, created_at as lastmod FROM article_categories WHERE slug IS NOT NULL AND slug != '' ORDER BY created_at DESC");
}
if (!$articleCatResult) {
    $articleCatResult = @mysqli_query($conn, "SELECT slug, created_at as lastmod FROM article_categories WHERE slug IS NOT NULL AND slug != '' ORDER BY id ASC");
}
if ($articleCatResult) {
    while ($cat = mysqli_fetch_assoc($articleCatResult)) {
        $slug = trim($cat['slug'] ?? '');
        if (!isValidSlug($slug)) continue;
        addUrl(
            $baseUrl . '/articles/' . htmlspecialchars($slug, ENT_XML1, 'UTF-8') . '.html',
            date('Y-m-d', strtotime($cat['lastmod'] ?? 'now')),
            'daily',
            '0.7'
        );
    }
    mysqli_free_result($articleCatResult);
}

// ========== 生成 XML ==========
$xml = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
$xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
foreach ($urls as $url) {
    $xml .= '  <url>' . "\n";
    $xml .= '    <loc>' . htmlspecialchars($url['loc'], ENT_XML1, 'UTF-8') . '</loc>' . "\n";
    $xml .= '    <lastmod>' . htmlspecialchars($url['lastmod'], ENT_XML1, 'UTF-8') . '</lastmod>' . "\n";
    $xml .= '    <changefreq>' . htmlspecialchars($url['changefreq'], ENT_XML1, 'UTF-8') . '</changefreq>' . "\n";
    $xml .= '    <priority>' . htmlspecialchars($url['priority'], ENT_XML1, 'UTF-8') . '</priority>' . "\n";
    $xml .= '  </url>' . "\n";
}
$xml .= '</urlset>';
echo $xml;
