import urllib.request
import ssl
import xml.etree.ElementTree as ET
from pathlib import Path

def fetch_wms_capabilities(url: str, referer: str):
    """Скачивает GetCapabilities и возвращает список слоёв."""
    headers = {"Referer": referer}
    
    # SSL контекст для игнорирования ошибок сертификата
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
    
    req = urllib.request.Request(url, headers=headers)
    
    try:
        with urllib.request.urlopen(req, context=ctx) as response:
            xml_data = response.read()
    except Exception as e:
        raise ConnectionError(f"Не удалось скачать GetCapabilities: {e}")

    # Парсинг XML с учётом пространства имён WMS
    root = ET.fromstring(xml_data)
    ns = {'wms': 'http://www.opengis.net/wms'}
    
    layers = []
    for layer_elem in root.findall('.//wms:Layer', ns):
        name_elem = layer_elem.find('wms:Name', ns)
        if name_elem is not None and name_elem.text:
            layer_name = name_elem.text
            # Заменяем ':' на '_'
            safe_name = layer_name.replace(':', '_')
            layers.append({
                'name': layer_name,
                'safe_name': safe_name
            })
    return layers

def generate_axioma_workspace(layers, output_path) -> None:
    """Генерирует XML рабочего набора Аксиомы через строковые шаблоны."""
    
    # Шаблон для одного WMSDataSourceDefinition (точно как в вашем примере)
    ds_template = """  <WMSDataSourceDefinition id="id{id}" providerId="WmsDataProvider" readOnly="true">
   <DataSourceName>{safe_name}</DataSourceName>
   <WMSConnection>
    <WMSCapabilitiesURL>https://pub.fgislk.gov.ru/map/geo/geoserver/wms?SERVICE=WMS&amp;VERSION=1.3.0</WMSCapabilitiesURL>
    <HeaderDataList>
     <HeaderData value="https://pub.fgislk.gov.ru/map/" name="referer"/>
    </HeaderDataList>
   </WMSConnection>
   <WMSConfiguration>
    <WMSVersion>1.3.0</WMSVersion>
    <WMSExceptionFormat>XML</WMSExceptionFormat>
    <WMSImageFormat excludeStyles="false" transparent="true" bgcolor="#ffffff">image/png</WMSImageFormat>
    <SRSName>mapinfo:coordsys 10, 157, "m", 0</SRSName>
    <WMSImageStyle></WMSImageStyle>
   </WMSConfiguration>
   <WMSLayerList>
    <WMSLayer>
     <WMSLayerName>{name}</WMSLayerName>
    </WMSLayer>
   </WMSLayerList>
  </WMSDataSourceDefinition>"""

    # Генерируем блоки для всех слоёв
    ds_blocks = []
    for i, layer in enumerate(layers, start=1):
        ds_blocks.append(ds_template.format(
            id=i,
            safe_name=layer['safe_name'],
            name=layer['name']
        ))
    
    ds_xml = "\n".join(ds_blocks)
    
    # Шаблон всего документа (корневой тег с правильными xmlns без префиксов)
    workspace_template = f"""<?xml version="1.0" encoding="UTF-8"?>
<WorkSpace xmlns:mxp="http://www.mapinfo.com/mxp" xmlns="http://www.mapinfo.com/mxp" xmlns:gml="http://www.opengis.net/gml">
 <ConnectionSet/>
 <DataSourceDefinitionSet>
{ds_xml}
 </DataSourceDefinitionSet>
 <MapDefinitionSet/>
 <MapinfoApplicationData>
  <MapinfoProfessionalWindows>
   <BrowserDefinitionSet/>
   <LayoutDefinitionSet/>
   <WindowDefinitionSet/>
  </MapinfoProfessionalWindows>
 </MapinfoApplicationData>
</WorkSpace>"""

    output_path = Path(output_path)
    output_path.parent.mkdir(parents=True, exist_ok=True)
    
    # Записываем как UTF-8 без BOM
    with open(output_path, "w", encoding="utf-8") as f:
        f.write(workspace_template)

if __name__ == "__main__":
    WMS_URL = "https://pub.fgislk.gov.ru/map/geo/geoserver/wms?service=WMS&request=GetCapabilities"
    REFERER = "https://pub.fgislk.gov.ru/map/"
    OUTPUT_FILE = Path(__file__).parent / r"fgislk.mws"

    print("Скачивание и парсинг GetCapabilities...")
    try:
        layers = fetch_wms_capabilities(WMS_URL, REFERER)
        print(f"Найдено слоёв: {len(layers)}")
        
        print("Генерация рабочего набора Аксиомы...")
        generate_axioma_workspace(layers, OUTPUT_FILE)
        print(f"Готово! Файл сохранён: {OUTPUT_FILE}")
        
    except Exception as e:
        print(f"Ошибка: {e}")
