<?php

ini_set('memory_limit', '512M');
ini_set('max_execution_time', 300);
ini_set('log_errors', 1);

ini_set('error_log', __DIR__ . '/sitemap_error.log');
set_time_limit(300);

$base_url = 'https://www.saraswatithermowood.com/';

$stateJson = @file_get_contents('seo/state-city-data/states.json');
$cityJson = @file_get_contents('seo/state-city-data/cities.json');
$productJson = @file_get_contents('seo/state-city-data/product.json');

if (!$stateJson || !$cityJson || !$productJson) {
    error_log('Failed to read one or more JSON files.');
    die('Error reading JSON files.');
}

$states = json_decode($stateJson, true);
$cities = json_decode($cityJson, true);
$product_pages = json_decode($productJson, true);

$CMS_pages = [
    'about-us',
    'blogs',
    'contact-us',
    'thermowood',
    'flooring',
    'ipe-wood',
    'thermo-pine',
    'thermo-ash',
    'thermo-ayous',
    'thermo-oak',
    'thermo-pine-cladding',
    'thermo-pine-decking',
    'thermo-pine-flooring',
    'thermo-ash-cladding',
    'thermo-ash-decking',
    'thermo-ash-flooring',
    'thermo-ayous-cladding',
    'thermo-ayous-decking',
    'thermo-ayous-flooring',
    'thermo-oak-cladding',
    'thermo-oak-decking',
    'thermo-oak-flooring',
    'solid-wood-flooring',
    'engineered-wood-flooring',
    'laminate-wood-flooring',
    'vinyal-flooring',
    'parquets-flooring',
    'herringbone-flooring',
    'chevron-flooring',
    'american-walnut-solid',
    'natural-oak-solid',
    'antique-oak-solid',
    'asian-walnut-solid',
    'burma-teak-solid',
    'african-teak-solid',
    'merbau-solid',
    'jatoba-solid',
    'oak-caramel-solid',
    'cumaru-solid',
    'american-walnut-engineered',
    'natural-oak-engineered',
    'oak-carbonized-light-engineered',
    'cherry-carbonized-engineered',
    'european-oak-engineered',
    'oak-graphite-engineered',
    'oak-carbonized-engineered',
    'burma-teak-engineered',
    'kaya-kuku-engineered',
    'teak-engineered',
    'american-walnut2-engineered',
    'english-grey-engineered',
    'oak-lime-washed-engineered',
    'kaya-kuku2-engineered',
    'natural-oak2-engineered',
    'forest-hickory-laminated',
    'frosty-laminated',
    'oak-ash-laminated',
    'oak-cashmere-laminated',
    'oak-honey-laminated',
    'grey-tiger-laminated',
    'oak-latte-laminated',
    'oak-charcoal-laminated',
    'oak-white-sand-laminated',
    'oak-earthy-laminated',
    'maple-laminated',
    'oak-pine-laminated',
    'oak-ebony-laminated',
    'oak-tribal-laminated',
    'sapeli-natural-laminated',
    'sapeli-wildlife-laminated',
    'wpc',
    'wpc-louvers-26mm',
    'wpc-florence-louvers',
    'wpc-decking',
    'l-corner-profile',
    'burma-teak-26mm',
    'panther-black-26mm',
    'sycamore-26mm',
    'rose-wood-26mm',
    'ipe-wood-26mm',
    'deep-wood-26mm',
    'silver-oak-26mm',
    'natural-teak-26mm',
    'african-walnut-26mm',
    'natural-teak-florence',
    'panther-black-florence',
    'silver-oak-florence',
    'ipe-wood-florence',
    'burma-teak-florence',
    'african-walnut-florence',
    'silver-oak-decking',
    'natural-teak-decking',
    'burma-teak-decking',
    'ipe-wood-decking',
    'african-walnut-decking',
    'rosewood-decking',
    'burma-teak-l-corner',
    'ipe-wood-l-corner',
    'deep-wood-l-corner',
    'silver-oak-l-corner',
    'ipe-cladding',
    'ipe-decking',
    'ipe-tiles'      
];

// Map cities by state ID
$cityMap = [];
foreach ($cities as $city) {
    $cityMap[$city['state_id']][] = $city;
}

$lastmod = date('Y-m-d');
$urlsPerFile = 40000;
$urlCount = 0;
$fileCount = 1;
$entryBuffer = [];
$sitemapFiles = [];

// Slug caches
$stateSlugs = [];
$citySlugs = [];
$productSlugs = [];

// Start XML
function startXml()
{
    return '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL .
        '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;
}

function endXml()
{
    return '</urlset>';
}

function addUrlEntry($loc, $lastmod, $priority = '0.8')
{
    return "  <url>\n" .
        "    <loc>" . htmlspecialchars($loc, ENT_QUOTES, 'UTF-8') . "</loc>\n" .
        "    <lastmod>$lastmod</lastmod>\n" .
        "    <changefreq>weekly</changefreq>\n" .
        "    <priority>$priority</priority>\n" .
        "  </url>\n";
}

// Save sitemap to file
function saveSitemap(&$fileCount, &$entryBuffer, &$sitemapFiles)
{
    $filename = "sitemap{$fileCount}.xml";
    $fp = fopen($filename, 'w');
    fwrite($fp, startXml());
    foreach ($entryBuffer as $entry) {
        fwrite($fp, $entry);
    }
    fwrite($fp, endXml());
    fclose($fp);
    $sitemapFiles[] = $filename;
    $fileCount++;
    $entryBuffer = [];
}

// Add entry with limit check
function addUrlWithLimit($url, $priority, &$urlCount, &$fileCount, &$entryBuffer, &$sitemapFiles, $lastmod)
{
    global $urlsPerFile;

    if ($urlCount >= $urlsPerFile) {
        saveSitemap($fileCount, $entryBuffer, $sitemapFiles);
        $urlCount = 0;
    }

    $entryBuffer[] = addUrlEntry($url, $lastmod, $priority);
    $urlCount++;
}

// Homepage
addUrlWithLimit($base_url, '1.0', $urlCount, $fileCount, $entryBuffer, $sitemapFiles, $lastmod);

// CMS Pages
foreach ($CMS_pages as $cms) {
    addUrlWithLimit($base_url . $cms, '0.8', $urlCount, $fileCount, $entryBuffer, $sitemapFiles, $lastmod);
}

// Product Pages (standard only)
foreach ($product_pages as $product) {
    if (!isset($productSlugs[$product['name']])) {
        $productSlugs[$product['name']] = str_replace(' ', '-', $product['name']);
    }

    $productSlug = $productSlugs[$product['name']];
    $url = $base_url . $product['page_type'] . '/' . $productSlug;
    addUrlWithLimit($url, '0.8', $urlCount, $fileCount, $entryBuffer, $sitemapFiles, $lastmod);
}

// State and City Product Pages (only if NOT category)
foreach ($states as $state) {
    $stateSlug = $stateSlugs[$state['name']] ?? strtolower(trim(preg_replace('/-+/', '-', preg_replace('/[^A-Za-z0-9]+/', '-', $state['name'])), '-'));

    foreach ($product_pages as $product) {
        if ($product['page_type'] === 'category') {
            continue; // Skip 'category' type for state/city URLs
        }

        $productSlug = $productSlugs[$product['name']];
        $url = $base_url . $product['page_type'] . '/' . $productSlug . '-in-' . $stateSlug;
        addUrlWithLimit($url, '0.7', $urlCount, $fileCount, $entryBuffer, $sitemapFiles, $lastmod);
    }

    if (isset($cityMap[$state['id']])) {
        foreach ($cityMap[$state['id']] as $city) {
            $citySlug = $citySlugs[$city['city']] ?? strtolower(trim(preg_replace('/-+/', '-', preg_replace('/[^A-Za-z0-9]+/', '-', $city['city'])), '-'));

            foreach ($product_pages as $product) {
                if ($product['page_type'] === 'category') {
                    continue;
                }

                $productSlug = $productSlugs[$product['name']];
                $url = $base_url . $product['page_type'] . '/' . $productSlug . '-in-' . $citySlug;
                addUrlWithLimit($url, '0.6', $urlCount, $fileCount, $entryBuffer, $sitemapFiles, $lastmod);
            }
        }
    }
}

// Final write
if ($urlCount > 0) {
    saveSitemap($fileCount, $entryBuffer, $sitemapFiles);
}

// Sitemap index
$sitemapIndex = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
$sitemapIndex .= '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;

foreach ($sitemapFiles as $file) {
    $sitemapIndex .= "  <sitemap>\n";
    $sitemapIndex .= "    <loc>{$base_url}{$file}</loc>\n";
    $sitemapIndex .= "    <lastmod>{$lastmod}</lastmod>\n";
    $sitemapIndex .= "  </sitemap>\n";
}

$sitemapIndex .= '</sitemapindex>';
file_put_contents('seo/sitemap_index.xml', $sitemapIndex);

// Success message
echo "✅ Sitemaps generated: " . implode(', ', $sitemapFiles) . "\n";
echo "📄 Sitemap index created: seo/sitemap_index.xml\n";
