"""
/***************************************************************************
                                 A QGIS plugin
 Набор инструментов для работы с материалами документации территориального планирования
 Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/
                             -------------------
        begin                : 2024-03-18
        git sha              : $Format:%H$
        copyright            : (C) 2024 by I.Bukharin/Mirproekt
        email                : iabukharin@gmail.com
 ***************************************************************************/
 Функции сравения XSD схем
"""

from .parseFgistpXSD import parseFgistpXSD

""" pathToDefXSD = 'd:/defaultFGISTP.xsd'
pathToNewXSD = 'd:/fgistp-10-izm-698.xsd' """

def compareFgisXSD(pathToDefXSD, pathToNewXSD):
    if pathToDefXSD == pathToNewXSD:
        return ''
    strResult = ''
    defDict = parseFgistpXSD(pathToDefXSD)
    newDict = parseFgistpXSD(pathToNewXSD)

    flagMirAttr = False
    flagAttrtypeUserName = False
    strResult += f'---------------------------------------<br />'
    strResult += f'<span><b>Сравнение defaultXSD с {pathToNewXSD}</b></span><br />'
    # check elements
    strResult += f'<span>проверка <b>elementTypes</b></span><br />'
    defElementTypes = defDict['elementTypes']
    newElementTypes = newDict['elementTypes']

    for elementTypeName, elementTypeValue in defElementTypes.items():
        newElementTypeValue = newElementTypes.get(elementTypeName, dict())
        if len(newElementTypeValue) == 0:
            strResult += f'<span>элемент(класса) <b>{elementTypeName}</b> не найден в новом XSD</span><br />'
            continue
        if elementTypeValue['elementType'] != newElementTypeValue['elementType']:
            strResult += f'<span>для элемента(класса) <b>{elementTypeName}</b> переопределен elementType {elementTypeValue["elementType"]} на <b>{newElementTypeValue["elementType"]}</b></span><br />'
        if elementTypeValue['typeUserName'] != newElementTypeValue['typeUserName']:
            strResult += f'<span>для элемента(класса) <b>{elementTypeName}</b> переопределен typeUserName {elementTypeValue["typeUserName"]} на <b>{newElementTypeValue["typeUserName"]}</b></span><br />'
        if elementTypeValue['documentation'] != newElementTypeValue['documentation']:
            strResult += f'<span>для элемента(класса) <b>{elementTypeName}</b> переопределен documentation {elementTypeValue["documentation"]} на <b>{newElementTypeValue["documentation"]}</b></span><br />'
        if elementTypeValue['mirGroup'] != newElementTypeValue['mirGroup'] and flagMirAttr:
            strResult += f'<span>для элемента(класса) <b>{elementTypeName}</b> переопределен mirGroup {elementTypeValue["mirGroup"]} на <b>{newElementTypeValue["mirGroup"]}</b></span><br />'
        del newElementTypes[elementTypeName]
    if len(newElementTypes) != 0:
            strResult += f'<span>найдены новые элементы(классы): <b>{list(newElementTypes.keys())}</b></span><br />'
    strResult += f'---------------------------------------<br />'

    # check simpleTypes
    strResult += f'<span>проверка <b>simpleTypes</b></span><br />'
    defSimpleTypes = defDict['simpleTypes']
    newSimpleTypes = newDict['simpleTypes']

    for simpleTypeName, simpleTypeValue in defSimpleTypes.items():
        newSimpleTypeValue = newSimpleTypes.get(simpleTypeName, dict())
        if len(newSimpleTypeValue) == 0:
            strResult += f'<span>простой тип <b>{simpleTypeName}</b> не найден в новом XSD</span><br />'
            continue
        if simpleTypeValue['typeUserName'] != newSimpleTypeValue['typeUserName']:
            strResult += f'<span>для простого типа <b>{simpleTypeName}</b> переопределен typeUserName {simpleTypeValue["typeUserName"]} на <b>{newSimpleTypeValue["typeUserName"]}</b></span><br />'
        if simpleTypeValue['documentation'] != newSimpleTypeValue['documentation']:
            strResult += f'<span>для простого типа <b>{simpleTypeName}</b> переопределен documentation {simpleTypeValue["documentation"]} на <b>{newSimpleTypeValue["documentation"]}</b></span><br />'
        if simpleTypeValue['baseType'] != newSimpleTypeValue['baseType']:
            strResult += f'<span>для простого типа <b>{simpleTypeName}</b> переопределен baseType {simpleTypeValue["baseType"]} на <b>{newSimpleTypeValue["baseType"]}</b></span><br />'
        if simpleTypeValue['dictValues'] != newSimpleTypeValue['dictValues']:
            strResult += f'<span>для простого типа <b>{simpleTypeName}</b> dictValues: исключены <b>{set(simpleTypeValue["dictValues"].items()) - set(newSimpleTypeValue["dictValues"].items())}</b>, добавлены <b>{set(newSimpleTypeValue["dictValues"].items()) - set(simpleTypeValue["dictValues"].items())}</b></span><br />'
        del newSimpleTypes[simpleTypeName]
    if len(newSimpleTypes) != 0:
            strResult += f'<span>найдены новые простые типы : <b>{list(newSimpleTypes.keys())}</b></span><br />'
    strResult += f'---------------------------------------<br />'

    # check complexTypes
    strResult += f'<span>проверка <b>complexTypes</b></span><br />'
    defComplexTypes = defDict['complexTypes']
    newComplexTypes = newDict['complexTypes']

    for complexTypeName, complexTypeValue in defComplexTypes.items():
        newComplexTypeValue = newComplexTypes.get(complexTypeName, dict())
        if len(newComplexTypeValue) == 0:
            strResult += f'<span>сложный тип <b>{complexTypeName}</b> не найден в новом XSD</span><br />'
            continue
        if set(complexTypeValue['geometryTypes']) != set(newComplexTypeValue['geometryTypes']):
            strResult += f'<span>для сложного типа <b>{complexTypeName}</b> переопределен geometryTypes {complexTypeValue["geometryTypes"]} на <b>{newComplexTypeValue["geometryTypes"]}</b></span><br />' 
        for attrName, attrTypeValue in complexTypeValue['attributes'].items():
            newAttrTypeValue = newComplexTypeValue['attributes'].get(attrName, dict())
            if len(newAttrTypeValue) == 0:
                strResult += f'<span>для сложного типа <b>{complexTypeName}</b> в новом XSD не найден атрибут <b>{attrName}</b></span><br />'
                continue
            if set(attrTypeValue['baseType']) != set(newAttrTypeValue['baseType']):
                strResult += f'<span>для сложного типа <b>{complexTypeName}</b> для атрибута <b>{attrName}</b> переопределен baseType {attrTypeValue["baseType"]} на <b>{newAttrTypeValue["baseType"]}</b></span><br />'
            if attrTypeValue['typeUserName'] != newAttrTypeValue['typeUserName'] and flagAttrtypeUserName:
                strResult += f'<span>для сложного типа <b>{complexTypeName}</b> для атрибута <b>{attrName}</b> переопределен typeUserName {attrTypeValue["typeUserName"]} на <b>{newAttrTypeValue["typeUserName"]}</b></span><br />'
            if not flagMirAttr and newAttrTypeValue['minOccurs'] == 'Y' and attrTypeValue['minOccurs'] == 'N':
                strResult += f'<span>для сложного типа <b>{complexTypeName}</b> для атрибута <b>{attrName}</b> переопределен minOccurs {attrTypeValue["minOccurs"]} на <b>{newAttrTypeValue["minOccurs"]}</b></span><br />'
            elif flagMirAttr and newAttrTypeValue['minOccurs'] != attrTypeValue['minOccurs']:
                strResult += f'<span>для сложного типа <b>{complexTypeName}</b> для атрибута <b>{attrName}</b> переопределен minOccurs {attrTypeValue["minOccurs"]} на <b>{newAttrTypeValue["minOccurs"]}</b></span><br />'
            
            if flagMirAttr and newAttrTypeValue['mirDepend'] != attrTypeValue['mirDepend']:
                strResult += f'<span>для сложного типа <b>{complexTypeName}</b> для атрибута <b>{attrName}</b> переопределен mirDepend {attrTypeValue["mirDepend"]} на <b>{newAttrTypeValue["mirDepend"]}</b></span><br />'
            del newComplexTypeValue['attributes'][attrName]
        if len(newComplexTypeValue['attributes']) != 0:
            strResult += f'<span>для сложного типа <b>{complexTypeName}</b> новые атрибуты <b>{list(newComplexTypeValue["attributes"].keys())}</b></span><br />'

        del newComplexTypes[complexTypeName]
    if len(newComplexTypes) != 0:
            strResult += f'<span>найдены новые простые типы : <b>{list(newComplexTypes.keys())}</b></span><br />'
    strResult += f'---------------------------------------<br />'

    return strResult
