<?php
header("Content-Type: application/xml; charset=utf-8");

require_once __DIR__ . "/loader.php";
require_once __DIR__ . "/run/autoloads.php";

$baseURL = SITE_URL;
global $pdo;

$type = $_GET['type'] ?? 'index';
$sub = isset($_GET['sub']) ? (int)$_GET['sub'] : 1;  // 分割されたサブセクションの番号

$perPage = 2000;  // 1つのサイトマップファイルに含めるURLの最大数

switch ($type) {
    case 'misc':
        $urls = [
            ['url' => $baseURL, 'priority' => '1.0', 'changefreq' => 'daily', 'lastmod' => date('Y-m-d')],
        ];
        outputSitemap($urls);
        break;
    case 'page':
        $urls = loadPageUrls();  // 静的ページURLをロードする関数を想定
        outputSitemap($urls);
        break;
    case 'post':
    if (!isset($_GET['sub'])) {
        // サブパラメータが指定されていない場合はポストのサイトマップインデックスを生成
        $count = $pdo->query("SELECT COUNT(*) FROM data_post")->fetchColumn();
        $totalPages = ceil($count / $perPage);
        outputSitemapIndex($totalPages, 'post');
    } else {
        // 特定のサブセクションのポストURLを生成
        $offset = ($sub - 1) * $perPage;
        $urls = loadPostUrls($offset, $perPage);
        outputSitemap($urls);
    }
    break;
    case 'category':
        if (!isset($_GET['sub'])) {
            // サブパラメータが指定されていない場合はカテゴリーのサイトマップインデックスを生成
            $count = $pdo->query("SELECT COUNT(*) FROM data_category")->fetchColumn();
            $totalPages = ceil($count / $perPage);
            outputSitemapIndex($totalPages, 'category');
        } else {
            // 特定のサブセクションのカテゴリーURLを生成
            $offset = ($sub - 1) * $perPage;
            $urls = loadCategoryUrls($offset, $perPage);
            outputSitemap($urls);
        }
        break;
    default:
        echo generateIndexSitemap();
}

function loadPageUrls() {
    global $baseURL;
    return [
        ['url' => $baseURL . '?privacy', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?disclaimer', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?contact', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?genre', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?genre_new', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?genre_ranking=day', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?genre_ranking=week', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?genre_ranking=month', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?genre_ranking=year', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?genre_ranking', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?av_new', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?av_ranking=day', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?av_ranking=week', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?av_ranking=month', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?av_ranking=year', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?av_ranking', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?series_new', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?series_ranking=day', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?series_ranking=week', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?series_ranking=month', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?series_ranking=year', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?series_ranking', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?director_new', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?director_ranking=day', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?director_ranking=week', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?director_ranking=month', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?director_ranking=year', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?director_ranking', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?maker_new', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?maker_ranking=day', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?maker_ranking=week', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?maker_ranking=month', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?maker_ranking=year', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?maker_ranking', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?keyword_ranking=day', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?keyword_ranking=week', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?keyword_ranking=month', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?keyword_ranking=year', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
        ['url' => $baseURL . '?keyword_ranking', 'priority' => '0.6', 'changefreq' => 'weekly', 'lastmod' => date('Y-m-d')],
    ];
}

function loadCategoryUrls($offset, $limit) {
    global $pdo, $baseURL;
    $stmt = $pdo->prepare("SELECT id, last_update FROM data_category LIMIT :offset, :limit");
    $stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
    $stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
    $stmt->execute();
    return array_map(function ($category) use ($baseURL) {
        return [
            'url' => $baseURL . '?category=' . $category['id'],
            'lastmod' => $category['last_update'],
            'changefreq' => 'weekly',
            'priority' => '0.8'
        ];
    }, $stmt->fetchAll(PDO::FETCH_ASSOC));
}

function outputSitemap($urls) {
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<?xml-stylesheet href="templates/sitemap.xsl" type="text/xsl"?>';
    echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
    foreach ($urls as $url) {
        echo '<url>';
        echo '<loc>' . htmlspecialchars($url['url']) . '</loc>';
        echo '<lastmod>' . htmlspecialchars($url['lastmod']) . '</lastmod>';
        echo '<changefreq>' . htmlspecialchars($url['changefreq']) . '</changefreq>';
        echo '<priority>' . htmlspecialchars($url['priority']) . '</priority>';
        echo '</url>';
    }
    echo '</urlset>';
}

function loadPostUrls($offset, $limit) {
    global $pdo, $baseURL;
    $stmt = $pdo->prepare("SELECT id, post_date FROM data_post LIMIT :offset, :limit");
    $stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
    $stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
    $stmt->execute();
    return array_map(function ($post) use ($baseURL) {
        return [
            'url' => $baseURL . '?entry=' . $post['id'],
            'lastmod' => date('Y-m-d', strtotime($post['post_date'])),
            'changefreq' => 'weekly',
            'priority' => '0.5' // この優先度は適宜調整してください。
        ];
    }, $stmt->fetchAll(PDO::FETCH_ASSOC));
}

function outputSitemapIndex($totalPages, $type) {
    global $baseURL;
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<?xml-stylesheet href="templates/sitemap.xsl" type="text/xsl"?>';
    echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
    for ($i = 1; $i <= $totalPages; $i++) {
        echo '<sitemap>';
        echo '<loc>' . htmlspecialchars($baseURL . "sitemap.xml?type=$type&sub=$i") . '</loc>';
        echo '<lastmod>' . date('Y-m-d') . '</lastmod>';
        echo '</sitemap>';
    }
    echo '</sitemapindex>';
}

function generateIndexSitemap() {
    global $baseURL;
    header("Content-Type: application/xml; charset=utf-8");
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<?xml-stylesheet href="templates/sitemap.xsl" type="text/xsl"?>';
    echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
    // 例として静的な日付を使用
    $lastmod = date('Y-m-d'); // 実際の日付は、サイトマップの実際の更新日に基づいて動的に設定することが望ましい
    echo '<sitemap><loc>' . htmlspecialchars($baseURL . 'sitemap.xml?type=misc') . '</loc><lastmod>' . $lastmod . '</lastmod></sitemap>';
    echo '<sitemap><loc>' . htmlspecialchars($baseURL . 'sitemap.xml?type=page') . '</loc><lastmod>' . $lastmod . '</lastmod></sitemap>';
    echo '<sitemap><loc>' . htmlspecialchars($baseURL . 'sitemap.xml?type=post') . '</loc><lastmod>' . $lastmod . '</lastmod></sitemap>';
    echo '<sitemap><loc>' . htmlspecialchars($baseURL . 'sitemap.xml?type=category') . '</loc><lastmod>' . $lastmod . '</lastmod></sitemap>';
    echo '</sitemapindex>';
}
?>
