#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Генератор sitemap-mainpages-sanjepidemstancija.xml
Сайт: https://sanjepidemstancija.ru/
Раздел: Основные страницы сайта (Main Pages)
"""

import xml.etree.ElementTree as ET
import re
from pathlib import Path

# === КОНФИГУРАЦИЯ ===
DOMAIN = "sanjepidemstancija.ru"
BASE_URL = f"https://{DOMAIN}"
INPUT_FILE = "сайты.txt"
OUTPUT_FILE = "sitemap-mainpages-sanjepidemstancija.xml"
LASTMOD = "2026-04-13T10:00:00+03:00"
CHANGEFREQ = "monthly"

# Основные страницы сайта (приоритеты)
MAIN_PAGES = [
    {"path": "/", "priority": "1.0"},
    {"path": "/contacts/", "priority": "0.9"},
    {"path": "/faq/", "priority": "0.9"},
    {"path": "/services/", "priority": "0.9"},
    {"path": "/prices/", "priority": "0.8"},
    {"path": "/snippets/", "priority": "0.8"},
    {"path": "/license/", "priority": "0.7"},
    {"path": "/certificates/", "priority": "0.7"},
    {"path": "/about/", "priority": "0.7"},
    {"path": "/reviews/", "priority": "0.6"},
    {"path": "/blog/", "priority": "0.6"},
    {"path": "/terms/", "priority": "0.5"},
    {"path": "/privacy/", "priority": "0.5"},
]

# Крупные города (приоритет 0.8 для их основных страниц)
MAJOR_CITIES = {
    'moskva', 'sankt-peterburg', 'novosibirsk', 'ekaterinburg', 'kazan',
    'nizhniy-novgorod', 'chelyabinsk', 'omsk', 'samara', 'rostov', 'ufa',
    'krasnoyarsk', 'voronezh', 'perm', 'volgograd', 'krasnodar', 'saratov',
    'tyumen', 'tolyatti', 'izhevsk', 'barnaul', 'ulyanovsk', 'irkutsk',
    'habarovsk', 'yaroslavl', 'vladivostok', 'mahachkala', 'tomsk',
    'orenburg', 'kemerovo', 'novokuzneck', 'ryazan', 'astrahan', 'penza',
    'lipeck', 'kirov', 'cheboksary', 'tula', 'kaliningrad', 'kursk',
    'sochi', 'stavropol', 'ulan-ude', 'sevastopol', 'magnitogorsk',
    'ivanovo', 'bryansk', 'belgorod', 'surgut', 'vladimir'
}

# Regex для извлечения поддомена
SUBDOMAIN_PATTERN = re.compile(
    rf"^https://([a-z0-9а-яё0-9-]+)\.{re.escape(DOMAIN)}/?$",
    re.IGNORECASE | re.UNICODE
)

def extract_subdomain(url: str) -> str | None:
    """Извлекает поддомен из полного URL"""
    url = url.strip()
    if not url.startswith(('https://', 'http://')):
        return None
    match = SUBDOMAIN_PATTERN.match(url)
    return match.group(1).lower() if match else None

def load_cities(filepath: str) -> list[str]:
    """Загружает уникальные поддомены из сайты.txt"""
    path = Path(filepath)
    if not path.exists():
        raise FileNotFoundError(f"Файл не найден: {filepath}")
    
    cities = set()
    with path.open('r', encoding='utf-8') as f:
        for line_num, line in enumerate(f, 1):
            line = line.strip()
            if not line or line.startswith('#'):
                continue
            if line.startswith('https://'):
                sub = extract_subdomain(line)
                if sub:
                    cities.add(sub)
    return sorted(cities)

def generate_sitemap(cities: list[str]) -> str:
    """Генерирует валидный XML Sitemap для основных страниц"""
    
    urlset = ET.Element('urlset', xmlns="http://www.sitemaps.org/schemas/sitemap/0.9")
    
    # 1. Основные страницы главного домена
    for page in MAIN_PAGES:
        url_elem = ET.SubElement(urlset, 'url')
        loc = f"{BASE_URL}{page['path']}"
        ET.SubElement(url_elem, 'loc').text = loc
        ET.SubElement(url_elem, 'lastmod').text = LASTMOD
        ET.SubElement(url_elem, 'changefreq').text = CHANGEFREQ
        ET.SubElement(url_elem, 'priority').text = page['priority']
    
    # 2. Основные страницы для каждого города (поддомена)
    for city in cities:
        # Добавляем только ключевые страницы для городов (чтобы не раздувать sitemap)
        city_pages = ["/", "/contacts/", "/faq/", "/services/", "/prices/"]
        priority = '0.8' if city in MAJOR_CITIES else '0.7'
        
        for page_path in city_pages:
            url_elem = ET.SubElement(urlset, 'url')
            loc = f"https://{city}.{DOMAIN}{page_path}"
            ET.SubElement(url_elem, 'loc').text = loc
            ET.SubElement(url_elem, 'lastmod').text = LASTMOD
            ET.SubElement(url_elem, 'changefreq').text = CHANGEFREQ
            ET.SubElement(url_elem, 'priority').text = priority
    
    # Собираем итоговый XML с декларацией
    xml_str = '<?xml version="1.0" encoding="UTF-8"?>\n'
    xml_str += ET.tostring(urlset, encoding='unicode')
    return xml_str

def main() -> None:
    print(f"🔄 Генерация sitemap-mainpages для {DOMAIN}...")
    
    try:
        cities = load_cities(INPUT_FILE)
        print(f"📊 Загружено уникальных городов: {len(cities)}")
        
        if not cities:
            print("❌ Ошибка: список городов пуст")
            return
        
        xml_content = generate_sitemap(cities)
        
        with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
            f.write(xml_content)
        
        total_urls = len(MAIN_PAGES) + len(cities) * 5  # 5 страниц на город
        print(f"✅ Файл сохранён: {OUTPUT_FILE}")
        print(f"📈 Всего URL в sitemap: {total_urls}")
        print(f"🔍 Крупных городов (priority=0.8): {len(set(cities) & MAJOR_CITIES)}")
        
    except FileNotFoundError as e:
        print(f"❌ Ошибка файла: {e}")
    except ET.ParseError as e:
        print(f"❌ Ошибка XML: {e}")
    except Exception as e:
        print(f"❌ Неожиданная ошибка: {type(e).__name__}: {e}")

if __name__ == "__main__":
    main()