import os
import sys
import xml.etree.ElementTree as ET
import pandas as pd
from collections import OrderedDict
import logging

# Настройка логирования
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')


def extract_data(element):
    data = OrderedDict()
    for child in element:
        if len(child) > 0:
            data[child.tag] = extract_data(child)
        else:
            data[child.tag] = child.text
    return data


def flatten_ordered_dict(d, parent_key='', sep='.'):
    items = []
    for k, v in d.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, OrderedDict):
            items.extend(flatten_ordered_dict(v, new_key, sep=sep).items())
        else:
            items.append((new_key, v))
    return OrderedDict(items)


def process_xml_file(file_path):
    logging.info(f"Обработка файла: {file_path}")
    try:
        tree = ET.parse(file_path)
        root = tree.getroot()
    except ET.ParseError as e:
        logging.error(f"Не удалось разобрать XML файл {file_path}: {e}")
        return pd.DataFrame()  # Возврат пустого DataFrame для неудачных файлов

    data = extract_data(root)
    flat_data = flatten_ordered_dict(data)
    df = pd.DataFrame([flat_data])

    df['fio_individual'] = df.apply(
        lambda
            row: f"{row.get('restrict_records.restrict_record.right_holders.right_holder.individual.surname', '-')} {row.get('restrict_records.restrict_record.right_holders.right_holder.individual.name', '')} {row.get('restrict_records.restrict_record.right_holders.right_holder.individual.patronymic', '')} {row.get('restrict_records.restrict_record.right_holders.right_holder.individual.birth_date', '')} {row.get('restrict_records.restrict_record.right_holders.right_holder.individual.birth_place', '')}",
        axis=1
    )

    df['identity_doc'] = df.apply(
        lambda
            row: f"{row.get('restrict_records.restrict_record.right_holders.right_holder.individual.identity_doc.document_name', '')} {row.get('restrict_records.restrict_record.right_holders.right_holder.individual.identity_doc.document_series', '-')} {row.get('restrict_records.restrict_record.right_holders.right_holder.individual.identity_doc.document_number', '')} {row.get('restrict_records.restrict_record.right_holders.right_holder.individual.identity_doc.document_date', '')} {row.get('restrict_records.restrict_record.right_holders.right_holder.individual.identity_doc.document_issuer', '')}",
        axis=1
    )

    columns_to_keep = [
        'land_record.object.common_data.cad_number',
        'land_record.object.common_data.quarter_cad_number',
        'fio_individual',
        'identity_doc',
        'land_record.address_location.address.readable_address',
        'land_record.special_notes',
    ]

    rename_dict = {
        'land_record.object.common_data.cad_number': 'Кадастровый номер',
        'land_record.object.common_data.quarter_cad_number': 'Кадастровый номер квартала',
        'fio_individual': 'ФИО физического лица',
        'identity_doc': 'Документ, удостоверяющий личность',
        'land_record.address_location.address.readable_address': 'Адрес',
        'land_record.special_notes': 'Особые отметки',
    }

    df = df.filter(items=columns_to_keep)
    df.rename(columns=rename_dict, inplace=True)

    logging.info(f"Файл {file_path} успешно обработан.")
    return df


directory_path = os.path.dirname(sys.argv[0])
logging.info(f"Поиск XML файлов в каталоге: {directory_path}")

all_files_data = []

for filename in os.listdir(directory_path):
    if filename.endswith('.xml'):
        file_path = os.path.join(directory_path, filename)
        df = process_xml_file(file_path)
        if not df.empty:
            all_files_data.append(df)

if all_files_data:
    logging.info("Объединение данных из всех XML файлов в один DataFrame.")
    final_df = pd.concat(all_files_data, ignore_index=True)
    output_file = 'output.xlsx'
    final_df.to_excel(output_file, index=False)
    logging.info(f"Данные успешно сохранены в файле {output_file}")
else:
    logging.warning("В каталоге не найдено XML файлов либо данные не были извлечены.") мне нужно что бы столбцы и строки были с подобранными интервалами под их размер