from django.contrib.sitemaps import Sitemap
from django.conf import settings
from django.urls import reverse
from types import SimpleNamespace
from urllib.parse import urlparse
from .models import Service, About

class SanitizedDomainSitemap(Sitemap):
    def get_urls(self, page=1, site=None, protocol=None):
        if site and getattr(site, 'domain', None):
            site_domain_raw = str(site.domain).strip().strip('/')
            if '://' in site_domain_raw:
                parsed = urlparse(site_domain_raw)
                normalized_domain = (parsed.netloc or parsed.path).strip('/')
            else:
                normalized_domain = site_domain_raw.split('/')[0]
            local_domains = {'127.0.0.1', '127.0.0.1:8000', 'localhost', 'localhost:8000'}
            configured_domain_raw = getattr(settings, 'META_SITE_DOMAIN', '').strip('/')
            if '://' in configured_domain_raw:
                configured_domain_parsed = urlparse(configured_domain_raw)
                configured_domain = (configured_domain_parsed.netloc or configured_domain_parsed.path).strip('/')
            else:
                configured_domain = configured_domain_raw.split('/')[0]
            if configured_domain in local_domains:
                configured_domain = next(
                    (host for host in getattr(settings, 'ALLOWED_HOSTS', []) if host not in local_domains and host != 'testserver'),
                    configured_domain,
                )
            if normalized_domain in local_domains and configured_domain:
                normalized_domain = configured_domain
            if normalized_domain not in local_domains and protocol in (None, 'http'):
                protocol = 'https'
            site = SimpleNamespace(
                domain=normalized_domain,
                name=getattr(site, 'name', normalized_domain),
            )
        return super().get_urls(page=page, site=site, protocol=protocol)


class ServiceSitemap(SanitizedDomainSitemap):
    changefreq = 'weekly'
    priority = 0.9
    
    def items(self):
        return Service.objects.filter(is_published=True).order_by('order', 'id')
    
    def lastmod(self, obj):
        return obj.updated_at if hasattr(obj, 'updated_at') else None

class AboutSitemap(SanitizedDomainSitemap):
    changefreq = 'monthly'
    priority = 0.8
    
    def items(self):
        return About.objects.filter(is_published=True).order_by('-updated_at', 'id')
    
    def lastmod(self, obj):
        return obj.updated_at

class StaticSitemap(SanitizedDomainSitemap):
    """Sitemap for static pages that don't have database models"""
    changefreq = 'monthly'
    priority = 0.7
    
    def items(self):
        return [
            'home',
            'about',
            'services',
            'contact',
            'team',
            'security',
            'cleaning',
            'properties',
            'retail',
            'construction',
            'healthcare',
            'transport',
            'education',
            'hospitality',
            'industries',
            'logistics',
            'environment',
            'code-of-conduct',
            'modern-slavery-statement',
            'inclusion-diversity',
            'infinitygroup_charity',
            'privacy_policy',
            'terms_of_service',
            'cookie_policy',
            'accessibility',
            'sitemap',
            'canada_main',
            'uae_main',
            'ireland_main',
        ]
    
    def location(self, item):
        return reverse(item)
    
    def lastmod(self, item):
        # Return None for static pages as they don't have modification dates
        return None
