import xml.etree.ElementTree as ET
import pandas as pd

xml_file = "exchanger.xml"
output_file = "all_devices_changes.xlsx"

try:
    tree = ET.parse(xml_file)
    root = tree.getroot()
    print("Парсинг прошел успешно")
except Exception as e:
    print(f"Ошибка: {e}")
    exit()

all_devices = root.findall('.//Device')
data_rows = []
all_conflicts = []

for device in all_devices:
    device_name = device.get("Name", "Unknown")
    all_states = device.findall('.//State')
    
    for state in all_states:
        cur_date = state.get("Key", "No_Date")
        seen_in_state = {}
        
        for prop in state.findall('.//Property'):
            key = prop.get("Key")
            val = str(prop.get("Value", ""))
            
            # Проверка на дубликаты внутри одного стейта
            if key in seen_in_state:
                all_conflicts.append({
                    "Device": device_name,
                    "Date": cur_date,
                    "Property": key,
                    "Values": f"{seen_in_state[key]} -> {val}"
                })
            seen_in_state[key] = val
            
            # Собираем общую базу данных
            data_rows.append({
                "Device": device_name,
                "Property": key,
                "Date": cur_date,
                "Value": val
            })

if not data_rows:
    print("Данные не найдены.")
    exit()

# Создаем один общий DataFrame
df = pd.DataFrame(data_rows)

# Формируем таблицу: строки сгруппированы по Девайсу и Параметру
pivot_df = df.pivot_table(
    index=['Device', 'Property'], 
    columns='Date', 
    values='Value', 
    aggfunc=lambda x: " | ".join(x)
)

# Сортируем даты (столбцы)
pivot_df = pivot_df.reindex(columns=sorted(pivot_df.columns))

# Фильтруем: оставляем только те строки, где значения менялись
# nunique(axis=1) считает уникальные значения в строке (горизонтально)
changes_only = pivot_df[pivot_df.nunique(axis=1, dropna=True) > 1]

# Сохраняем в один лист
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
    changes_only.to_excel(writer, sheet_name="Changes_Report")
    
    if all_conflicts:
        pd.DataFrame(all_conflicts).to_excel(writer, sheet_name="Conflicts_Log", index=False)
        print(f"Внимание: обнаружено дублей: {len(all_conflicts)}. См. лист Conflicts_Log")

print(f"Файл сохранен: {output_file}")
