import matplotlib.pyplot as plt
from collections import Counter
import re
import chardet

def detect_encoding(file_path):
    with open(file_path, 'rb') as file:
        raw_data = file.read()
    result = chardet.detect(raw_data)
    return result['encoding']

def read_voynich_data(file_path):
    encodings_to_try = ['utf-8', 'iso-8859-1', 'windows-1252', 'ascii']
    
    detected_encoding = detect_encoding(file_path)
    if detected_encoding:
        encodings_to_try.insert(0, detected_encoding)
    
    for encoding in encodings_to_try:
        try:
            with open(file_path, 'r', encoding=encoding) as file:
                content = file.read()
            print(f"Fișierul a fost citit cu succes folosind codificarea: {encoding}")
            return content
        except UnicodeDecodeError:
            continue
    
    print("Nu s-a putut citi fișierul cu niciuna dintre codificările încercate.")
    return None

def parse_voynich_text(text):
    if not text:
        return {}
    lines = text.split('\n')
    parsed_data = {}
    for line in lines:
        match = re.match(r'<(\d+\w+\.\d+)>(.*)', line)
        if match:
            page_line, content = match.groups()
            parsed_data[page_line] = content
    return parsed_data

def clean_text(text):
    return re.sub(r'[^a-zA-Z0-9.,!?]', '', text)

def char_frequency(text):
    return Counter(text)

def plot_frequency(freq_dict, title):
    if not freq_dict:
        print("Nu există date de frecvență pentru a fi afișate.")
        return
    chars, freqs = zip(*freq_dict.most_common(20))
    plt.figure(figsize=(12, 6))
    plt.bar(chars, freqs)
    plt.title(title)
    plt.xlabel('Caractere')
    plt.ylabel('Frecvență')
    plt.show()

def find_repeating_sequences(text, length):
    sequences = [text[i:i+length] for i in range(len(text) - length + 1)]
    return Counter(sequences)

def interactive_analysis():
    file_path = "voyn_101.txt"  # Numele fișierului local
    print(f"Citim datele din fișierul local: {file_path}")
    voynich_text = read_voynich_data(file_path)
    
    if not voynich_text:
        print("Nu s-au putut citi datele. Programul se va închide.")
        return

    parsed_data = parse_voynich_text(voynich_text)
    if not parsed_data:
        print("Nu s-au putut analiza datele. Este posibil ca formatul fișierului să fie diferit de cel așteptat.")
        print("Vom încerca să continuăm cu textul brut.")
        parsed_data = {"text_brut": voynich_text}

    print(f"S-au găsit {len(parsed_data)} linii de text sau secțiuni.")
    
    while True:
        print("\nOpțiuni de analiză:")
        print("1. Afișează conținutul unei pagini și rând specific (sau primele linii ale textului brut)")
        print("2. Calculează și afișează frecvența caracterelor")
        print("3. Caută secvențe repetitive")
        print("4. Analizează distribuția lungimii 'cuvintelor'")
        print("5. Ieșire")

        choice = input("Alege o opțiune (1-5): ")

        if choice == '1':
            if "text_brut" in parsed_data:
                print("Primele 5 linii ale textului:")
                print("\n".join(voynich_text.split('\n')[:5]))
            else:
                page_line = input("Introdu pagina și rândul (ex: 1r.1): ")
                if page_line in parsed_data:
                    print(f"Conținut pentru {page_line}: {parsed_data[page_line]}")
                else:
                    print("Pagină și rând nevalide.")
        elif choice == '2':
            all_text = clean_text(''.join(parsed_data.values()))
            if not all_text:
                print("Textul curățat este gol. Verifică funcția de curățare.")
            else:
                print(f"Lungimea textului curățat: {len(all_text)}")
                freq = char_frequency(all_text)
                plot_frequency(freq, "Frecvența caracterelor în Manuscrisul Voynich")
        elif choice == '3':
            length = int(input("Introdu lungimea secvenței (ex: 3): "))
            all_text = clean_text(''.join(parsed_data.values()))
            if not all_text:
                print("Textul curățat este gol. Verifică funcția de curățare.")
            else:
                seq_freq = find_repeating_sequences(all_text, length)
                print(f"Cele mai comune secvențe de {length} caractere:")
                for seq, count in seq_freq.most_common(10):
                    print(f"{seq}: {count}")
        elif choice == '4':
            word_lengths = [len(word) for line in parsed_data.values() for word in line.split('.')]
            if not word_lengths:
                print("Nu s-au găsit cuvinte pentru analiză.")
            else:
                plt.figure(figsize=(12, 6))
                plt.hist(word_lengths, bins=range(1, max(word_lengths) + 2), align='left')
                plt.title("Distribuția lungimii 'cuvintelor' în Manuscrisul Voynich")
                plt.xlabel("Lungimea 'cuvântului'")
                plt.ylabel("Frecvența")
                plt.show()
        elif choice == '5':
            print("La revedere!")
            break
        else:
            print("Opțiune invalidă. Te rog alege din nou.")

if __name__ == "__main__":
    interactive_analysis()
