import tkinter as tk
from tkinter import filedialog, messagebox, simpledialog
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT
import os
import re
import unicodedata

def remove_diacritics(text):
    """Elimină diacriticele din text"""
    normalized = unicodedata.normalize('NFKD', text)
    return ''.join(c for c in normalized if not unicodedata.combining(c))

def process_links(text):
    """Procesează și păstrează linkurile intacte"""
    # Regex pentru identificarea linkurilor (http(s)://, www)
    url_pattern = r'(https?://[^\s]+|www\.[^\s]+)'
    
    # Găsește toate linkurile și le marchează
    processed_text = re.sub(url_pattern, r'<link>\g<0></link>', text)
    
    return processed_text

def create_advanced_pdf(input_files, classification_text):
    for txt_file in input_files:
        pdf_file = os.path.splitext(txt_file)[0] + ".pdf"
        
        # Folosim SimpleDocTemplate pentru o formatare mai avansată
        doc = SimpleDocTemplate(
            pdf_file,
            pagesize=A4,
            leftMargin=50,
            rightMargin=50,
            topMargin=60,
            bottomMargin=60
        )
        
        # Pregătim stilurile
        styles = getSampleStyleSheet()
        
        # Stil pentru textul principal - justificat și cu spațiere optimă
        text_style = ParagraphStyle(
            'CustomText',
            parent=styles['Normal'],
            fontSize=11,
            leading=14,  # Spațiere între rânduri
            alignment=TA_JUSTIFY,
            spaceAfter=8,
            firstLineIndent=20,  # Indent pentru paragrafe
        )
        
        # Stil pentru titluri
        title_style = ParagraphStyle(
            'Title',
            parent=styles['Heading2'],
            fontSize=14,
            spaceAfter=12,
            spaceBefore=12,
            alignment=TA_LEFT
        )
        
        # Stil pentru link-uri
        link_style = ParagraphStyle(
            'Link',
            parent=text_style,
            textColor=colors.blue,
            underline=True
        )
        
        # Lista de elemente pentru PDF
        elements = []
        
        # Citire text din fișier
        with open(txt_file, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # Procesăm conținutul
        paragraphs = content.split('\n\n')
        
        for para in paragraphs:
            if para.strip():
                # Verificăm dacă paragraful ar putea fi un titlu
                lines = para.strip().split('\n')
                if len(lines) == 1 and len(lines[0]) < 80 and lines[0].isupper():
                    # Acesta pare a fi un titlu
                    p = Paragraph(remove_diacritics(lines[0]), title_style)
                else:
                    # Procesăm pentru link-uri
                    processed_para = process_links(para.replace('\n', ' '))
                    p = Paragraph(remove_diacritics(processed_para), text_style)
                
                elements.append(p)
                elements.append(Spacer(1, 6))  # Spațiu între paragrafe
        
        # Construiește documentul
        doc.build(elements, onFirstPage=lambda canvas, doc: add_page_elements(canvas, doc, classification_text),
                 onLaterPages=lambda canvas, doc: add_page_elements(canvas, doc, classification_text))

def add_page_elements(canvas, doc, classification_text):
    """Adaugă header, footer și elemente decorative la fiecare pagină"""
    width, height = A4
    
    # Clasificare fără diacritice
    classification_clean = remove_diacritics(classification_text).upper()
    
    # Header
    canvas.saveState()
    canvas.setFont('Helvetica-Bold', 12)
    canvas.setFillColor(colors.red)
    canvas.drawString(50, height - 30, classification_clean)
    
    # Footer
    canvas.drawString(50, 30, classification_clean)
    
    # Linii decorative
    canvas.setStrokeColor(colors.red)
    canvas.setLineWidth(1)
    canvas.line(50, height - 40, width - 50, height - 40)  # sub header
    canvas.line(50, 40, width - 50, 40)  # deasupra footer
    
    # Număr pagină (centrat)
    canvas.setFont('Helvetica', 10)
    page_num = canvas.getPageNumber()
    canvas.drawString(width/2, 30, f"Pagina {page_num}")
    
    canvas.restoreState()

def main():
    root = tk.Tk()
    root.withdraw()  # Ascunde fereastra principală
    
    # Dialog pentru clasificare (va fi folosită atât pentru header cât și pentru footer)
    classification = simpledialog.askstring(
        "Clasificare", 
        "Introdu textul pentru clasificare (ex: SECRET, TOP SECRET):",
        parent=root
    )
    
    if not classification:
        classification = "CONFIDENTIAL"
    
    # Selectare fișiere
    files = filedialog.askopenfilenames(
        title="Selectează fișierele text",
        filetypes=[("Text files", "*.txt")]
    )
    
    if files:
        try:
            create_advanced_pdf(files, classification)
            messagebox.showinfo("Succes", "Fișierele au fost convertite în PDF cu succes!")
        except Exception as e:
            messagebox.showerror("Eroare", f"A apărut o eroare: {str(e)}")
    
    root.destroy()

if __name__ == "__main__":
    main()
