import os
import pandas as pd
import tkinter as tk
from tkinter import filedialog, messagebox
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, Image
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch

# Функция для чтения данных из Excel-файлов
def read_excel_files(folder1, folder2):
    try:
        files1 = [os.path.join(folder1, f) for f in os.listdir(folder1) if f.endswith('.xlsx')]
        files2 = [os.path.join(folder2, f) for f in os.listdir(folder2) if f.endswith('.xlsx')]
        
        df1_list = [pd.read_excel(f) for f in files1]
        df2_list = [pd.read_excel(f) for f in files2]
        
        df1 = pd.concat(df1_list, ignore_index=True)
        df2 = pd.concat(df2_list, ignore_index=True)
        
        return df1, df2
    except Exception as e:
        messagebox.showerror("Ошибка", f"Произошла ошибка при чтении файлов: {str(e)}")
        return None, None

# Функция для сопоставления данных
def match_data(df1, df2):
    try:
        merged_df = pd.merge(df1, df2, left_on='Проект', right_on='Название проекта', how='left')
        return merged_df
    except Exception as e:
        messagebox.showerror("Ошибка", f"Ошибка при сопоставлении данных: {str(e)}")
        return None

# Функция для создания PDF-файла
def create_pdf(row, pdf_filename):
    try:
        doc = SimpleDocTemplate(pdf_filename, pagesize=A4)
        styles = getSampleStyleSheet()
        story = []

        # Заголовок
        story.append(Paragraph("Информация по проекту", styles['Title']))
        story.append(Spacer(1, 12))

        # Основная информация
        story.append(Paragraph(f"Оборудование: {row['Тип оборудования']}", styles['Heading2']))
        story.append(Paragraph(f"Проект: {row['Проект']}", styles['Normal']))
        story.append(Paragraph(f"Адрес в ТТ/Зона размещения: {row['Место выкладки товара (адрес)']}", styles['Normal']))
        story.append(Paragraph(f"Название оборудования: {row['Фактический размер оборудования на котором размещается проект']}", styles['Normal']))
        story.append(Paragraph(f"Полный период размещения: {row['Полный период размещения']}", styles['Normal']))
        story.append(Paragraph(f"Действия по окончанию размещения: {row['Действия ТТ по окончанию акции']}", styles['Normal']))
        story.append(Spacer(1, 12))

        # Таблица с товарными позициями
        data = [['Код позиции', 'Наименование позиции', 'Загрузка в шт']]
        for index, item in row.iterrows():
            data.append([item['Код позиции'], item['Наименование позиции'], item['Загрузка в шт']])
        table = Table(data)
        table.setStyle([('BACKGROUND', (0, 0), (-1, 0), colors.grey),
                        ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
                        ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
                        ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
                        ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
                        ('BACKGROUND', (0, 1), (-1, -1), colors.beige),
                        ('GRID', (0, 0), (-1, -1), 1, colors.black)])
        story.append(table)

        # Добавление фотографии, если тип оборудования = 'Оборудование КА'
        if row['Тип оборудования'] == 'Оборудование КА' and pd.notna(row['Путь']):
            img = Image(row['Путь'], width=2*inch, height=2*inch)
            story.append(Spacer(1, 12))
            story.append(img)

        doc.build(story)
    except Exception as e:
        messagebox.showerror("Ошибка", f"Ошибка при создании PDF: {str(e)}")

# Функция для запуска процесса обработки
def process_files():
    folder1 = folder1_var.get()
    folder2 = folder2_var.get()
    
    if not folder1 or not folder2:
        messagebox.showerror("Ошибка", "Пожалуйста, выберите обе папки.")
        return
    
    df1, df2 = read_excel_files(folder1, folder2)
    if df1 is None or df2 is None:
        return

    merged_df = match_data(df1, df2)
    if merged_df is None:
        return
    
    output_folder = os.path.join(os.getcwd(), "output_pdfs")
    os.makedirs(output_folder, exist_ok=True)
    
    for index, row in merged_df.iterrows():
        pdf_filename = os.path.join(output_folder, f"{row['Код ТТ']}_{row['Проект']}.pdf")
        create_pdf(row, pdf_filename)
    
    messagebox.showinfo("Готово", f"PDF-файлы сформированы и сохранены в папке {output_folder}.")

# Функция для выбора папки
def select_folder(var):
    folder_selected = filedialog.askdirectory()
    var.set(folder_selected)

# Создание графического интерфейса
root = tk.Tk()
root.title("Формирование PDF-файлов")

folder1_var = tk.StringVar()
folder2_var = tk.StringVar()

tk.Label(root, text="Папка с файлами ТТ-ТП проектов:").grid(row=0, column=0, padx=10, pady=10)
tk.Entry(root, textvariable=folder1_var, width=50).grid(row=0, column=1, padx=10, pady=10)
tk.Button(root, text="Выбрать папку", command=lambda: select_folder(folder1_var)).grid(row=0, column=2, padx=10, pady=10)

tk.Label(root, text="Папка с файлами проектов и фото:").grid(row=1, column=0, padx=10, pady=10)
tk.Entry(root, textvariable=folder2_var, width=50).grid(row=1, column=1, padx=10, pady=10)
tk.Button(root, text="Выбрать папку", command=lambda: select_folder(folder2_var)).grid(row=1, column=2, padx=10, pady=10)

tk.Button(root, text="Запустить обработку", command=process_files).grid(row=2, column=1, padx=10, pady=20)

root.mainloop() - ошибка ---------------------------
Ошибка
---------------------------
Ошибка при создании PDF: 'Series' object has no attribute 'iterrows'
---------------------------
ОК   
---------------------------