import os
import re
import sys

# Próbáljuk importálni a szükséges modulokat
try:
    from docx import Document
    from odf.opendocument import load
    from odf.text import P
except ImportError as e:
    print("HIBA: Hiányzó modulok!")
    print(f"Részletek: {e}")
    print("Futtasd ezt a parancssorban: pip install python-docx odfpy")
    input("Nyomj Entert a kilépéshez...")
    sys.exit()

# --- BEÁLLÍTÁSOK ---
FORRAS_MAPPA = "." 

def get_docx_text(path):
    """Szöveg kinyerése DOCX fájlból (Paragrafusok + TÁBLÁZATOK!)"""
    try:
        doc = Document(path)
        full_text = []
        
        # 1. Normál szöveg bekezdések
        for para in doc.paragraphs:
            if para.text.strip():
                full_text.append(para.text.strip())
        
        # 2. Táblázatok tartalmának kinyerése
        for table in doc.tables:
            for row in table.rows:
                for cell in row.cells:
                    if cell.text.strip():
                        clean_cell = cell.text.strip().replace("\n", " ")
                        full_text.append(clean_cell)

        return " ".join(full_text)
    except Exception as e:
        print(f" [!] HIBA a fájl olvasásakor ({path}): {e}")
        return ""

def get_odt_text(path):
    """Szöveg kinyerése ODT fájlból"""
    try:
        doc = load(path)
        full_text = []
        for element in doc.getElementsByType(P):
            text_content = ""
            for node in element.childNodes:
                if node.nodeType == 3: # Szöveges csomópont
                    text_content += node.data
            if text_content.strip():
                full_text.append(text_content.strip())
        return " ".join(full_text)
    except Exception as e:
        print(f" [!] HIBA az ODT olvasásakor ({path}): {e}")
        return ""

def clean_and_cut_text(raw_text):
    """
    Ez a függvény végzi a tisztítást és a 'vágást'.
    Megpróbálja megtalálni, hol kezdődik a megoldás (kód), és azt levágja.
    """
    # 1. Alap tisztítás (sortörések és idézőjelek cseréje)
    text = raw_text.replace("\n", " ").replace("\r", " ").replace('"', "'")
    
    # 2. Vágó szavak listája
    # Ha a program ezeket megtalálja, feltételezi, hogy innentől kezdődik a megoldás, nem a prompt.
    vago_szavak = [
        "Option Explicit", 
        "Sub CSV", 
        "Sub Macro",
        "Sub ",     # Általános makró kezdet
        "Public Sub",
        "Function ",
        "Output:", 
        "Eredmény:", 
        "Megoldás:",
        "LLM válasza:", 
        "Kod:", 
        "Kód:",
        "Code:",
        "Az elkészült makró",
        "A makró kódja",
        "Fájl neve Sorok száma" # A táblázat fejléce, ami gyakran benne marad
    ]
    
    # Megkeressük a legelső vágó szót
    legkisebb_index = len(text)
    found_cut = False

    for szo in vago_szavak:
        # Kis/nagybetű független kereséshez trükk
        # (Itt most egyszerű keresést használunk, mert a vágószavak többsége specifikus)
        idx = text.find(szo)
        
        # Ha megtaláltuk a szót, és az nem a legelején van (pl. a "A kód..." szöveg a prompt része lehet)
        # Ezért csak a 20. karakter utáni találatot vesszük figyelembe vágásnak.
        if idx != -1 and idx > 20: 
            if idx < legkisebb_index: 
                legkisebb_index = idx
                found_cut = True
    
    # Levágjuk a szöveget a talált pontnál
    if found_cut:
        text = text[:legkisebb_index]

    # 3. Dupla szóközök irtása a végén
    text = " ".join(text.split())
    
    return text

def identify_metadata(filename, text):
    text_upper = text.upper()
    
    # 1. NEPTUN: Keressük a 6 karakteres kódot a fájlnévben
    neptun_match = re.search(r"([A-Z0-9]{6})", filename.upper())
    neptun = neptun_match.group(1) if neptun_match else "ISMERETLEN"

    # 2. NYELV
    if "WRITE" in text_upper or "MACRO" in text_upper and "FELADAT" not in text_upper:
        nyelv = "Angol"
    else:
        nyelv = "Magyar"

    # 3. MACRO TÍPUS
    if "EXCEL" in text_upper or "VBA" in text_upper:
        macro_tipus = "MS Excel (VBA)"
    elif "LIBRE" in text_upper or "CALC" in text_upper:
        macro_tipus = "LibreOffice"
    else:
        macro_tipus = "MS Excel (VBA)" # Default

    # 4. LLM
    llm = "ISMERETLEN"
    if "CHATGPT" in text_upper or "OPENAI" in text_upper:
        llm = "ChatGPT"
    elif "COPILOT" in text_upper or "BING" in text_upper:
        llm = "MS Copilot"
    elif "GEMINI" in text_upper or "BARD" in text_upper:
        llm = "Google Gemini"
    elif "DEEPSEEK" in text_upper:
        llm = "DeepSeek"
    elif "CLAUDE" in text_upper:
        llm = "Claude"
    
    return neptun, nyelv, macro_tipus, llm

def main():
    cwd = os.getcwd()
    print("-" * 50)
    print(f"Mappa: {cwd}")
    
    all_files = os.listdir(FORRAS_MAPPA)
    target_files = [f for f in all_files if f.lower().endswith(('.docx', '.odt'))]
    target_files.sort()

    print(f"Feldolgozandó fájlok száma: {len(target_files)} db")
    print("-" * 50)

    if len(target_files) == 0:
        print("HIBA: Nincsenek docx/odt fájlok a mappában!")
        return

    with open("prompt.txt", "w", encoding="utf-8") as f_prompt, \
         open("kodok.txt", "w", encoding="utf-8") as f_kodok:
        
        count = 0
        for i, filename in enumerate(target_files, start=1):
            filepath = os.path.join(FORRAS_MAPPA, filename)
            
            # 1. Nyers szöveg kinyerése
            if filename.lower().endswith('.docx'):
                raw_text = get_docx_text(filepath)
            elif filename.lower().endswith('.odt'):
                raw_text = get_odt_text(filepath)
            
            if not raw_text:
                print(f"{filename}: [FIGYELEM: ÜRES!]")
                continue

            # 2. Tisztítás és Vágás (Okos logika)
            final_text = clean_and_cut_text(raw_text)

            # 3. Metaadatok
            neptun, nyelv, macro, llm = identify_metadata(filename, raw_text) # Eredeti szövegből keresünk

            # 4. Kiírás
            f_prompt.write(f'O({i}) = "{final_text}"\n')
            f_kodok.write(f'O({i}),{neptun},{nyelv},{macro},{llm}\n')
            
            # Progress bar szerű kiírás
            print(f"Feldolgozva: {filename} -> O({i})")
            count += 1

    print("-" * 50)
    print(f"KÉSZ! {count} fájl feldolgozva.")
    print("FONTOS: Nyisd meg a prompt.txt-t és ellenőrizd, hogy a kódok tényleg eltűntek-e a sorok végéről!")
    input("Nyomj Entert a kilépéshez...")

if __name__ == "__main__":
    main()