<?php

namespace App\Http\Controllers;

use App\Models\Category;
use App\Models\Product;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Route;

class SitemapController extends Controller
{
    public function index(): Response
    {
        $urls = [];

        $urls[] = ['loc' => url('/'), 'lastmod' => null];

        $staticRouteNames = [
            'page.about-us',
            'page.contact-us',
            'page.faqs',
            'page.size-care-guide',
            'policy.privacy',
            'policy.refund',
            'policy.shipping',
            'policy.cancellation',
            'policy.support',
            'policy.terms',
        ];

        foreach ($staticRouteNames as $name) {
            if (Route::has($name)) {
                $urls[] = ['loc' => route($name, absolute: true), 'lastmod' => null];
            }
        }

        foreach (['best-sellers', 'new-arrivals'] as $slug) {
            $urls[] = [
                'loc' => route('collections.show', ['slug' => $slug], absolute: true),
                'lastmod' => null,
            ];
        }

        Category::query()->active()->orderBy('id')->chunk(200, function ($categories) use (&$urls) {
            foreach ($categories as $category) {
                $urls[] = [
                    'loc' => route('collections.show', ['slug' => $category->slug], absolute: true),
                    'lastmod' => $category->updated_at?->toAtomString(),
                ];
            }
        });

        Product::query()
            ->whereNull('parent_id')
            ->active()
            ->forWebsite()
            ->orderBy('id')
            ->chunk(500, function ($products) use (&$urls) {
                foreach ($products as $product) {
                    $urls[] = [
                        'loc' => route('product.show', ['slug' => $product->slug], absolute: true),
                        'lastmod' => $product->updated_at?->toAtomString(),
                    ];
                }
            });

        $xml = '<?xml version="1.0" encoding="UTF-8"?>';
        $xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
        foreach ($urls as $row) {
            $xml .= '<url><loc>'.htmlspecialchars($row['loc'], ENT_XML1 | ENT_QUOTES, 'UTF-8').'</loc>';
            if (! empty($row['lastmod'])) {
                $xml .= '<lastmod>'.htmlspecialchars($row['lastmod'], ENT_XML1 | ENT_QUOTES, 'UTF-8').'</lastmod>';
            }
            $xml .= '</url>';
        }
        $xml .= '</urlset>';

        return response($xml, 200)->header('Content-Type', 'application/xml; charset=UTF-8');
    }

    public function robots(): Response
    {
        $base = rtrim((string) config('app.url'), '/');
        $sitemapUrl = $base.'/sitemap.xml';

        $lines = [
            'User-agent: *',
            'Disallow: /admin',
            'Disallow: /cart',
            'Disallow: /checkout',
            'Disallow: /login',
            'Disallow: /profile',
            'Disallow: /orders',
            'Disallow: /wishlist',
            'Disallow: /tickets',
            'Disallow: /notifications',
            'Disallow: /api/',
            '',
            'Sitemap: '.$sitemapUrl,
        ];

        return response(implode("\n", $lines), 200)
            ->header('Content-Type', 'text/plain; charset=UTF-8');
    }
}
