# [Codul rămâne același până la funcția main()]

def main():
    print("Experiment de Comunicare Cuantică Retrocauzală")
    print("---------------------------------------------")
    print("\nConfigurare parametri experiment:")
    print("(Apăsați ENTER pentru a folosi valorile implicite din experimentul original)\n")

    # Obținem configurația implicită
    config = get_default_config()
    
    # Explicații și configurare parametri fizici
    print("\nPARAMETRI FIZICI:")
    print("------------------")
    print("1. Lungimea fibrei optice:")
    print("   - Determină distanța pe care trebuie să călătorească fotonii")
    print("   - Afectează timpul de propagare și pierderile în fibră")
    print("   - În experimentul original: 10 km")
    config['fiber_length'] = get_validated_input(
        "Introduceți lungimea fibrei optice", config['fiber_length'], 0.1, "km")

    print("\n2. Lungimea de undă a fotonilor:")
    print("   - Caracterizează fotonii folosiți în experiment")
    print("   - În experimentul original se folosesc 702 nm (infraroșu apropiat)")
    print("   - Afectează energia fotonilor și eficiența detecției")
    config['wavelength'] = get_validated_input(
        "Introduceți lungimea de undă", config['wavelength'], 100, "nm")
    
    print("\nPARAMETRI OPTIMIZARE:")
    print("---------------------")
    print("1. Număr măsurători per bit:")
    print("   - Câte măsurători se fac pentru fiecare bit transmis")
    print("   - Mai multe măsurători = acuratețe mai bună, dar durează mai mult")
    print("   - Valoarea implicită este 5 măsurători/bit")
    config['measurement_samples'] = int(get_validated_input(
        "Introduceți numărul de măsurători per bit", config['measurement_samples'], 1))

    print("\n2. Iterații per măsurătoare:")
    print("   - De câte ori se repetă procesul pentru fiecare măsurătoare")
    print("   - Mai multe iterații = rezultate mai stabile")
    print("   - Valoarea implicită este 3 iterații")
    config['iterations'] = int(get_validated_input(
        "Introduceți numărul de iterații", config['iterations'], 1))

    print("\n3. Factor reducere zgomot:")
    print("   - Controlează cât de mult zgomot cuantic este permis")
    print("   - Valori mai mici = mai puțin zgomot = transmisie mai stabilă")
    print("   - Valoarea implicită este 0.05")
    config['noise_reduction'] = get_validated_input(
        "Introduceți factorul de reducere a zgomotului", config['noise_reduction'], 0.01)
    
    print("\nAlți parametri configurați automat:")
    print(f"- Index refracție fibră: {config['refractive_index']}")
    print(f"- Eficiență BBO: {config['bbo_efficiency']} perechi/s/mW")
    print(f"- Putere pompaj: {config['pump_power']*1000} mW")
    print(f"- Prag detecție: {config['detection_threshold']}")

    channel = RetrocausalQuantumChannel(config)
    
    print("\nConfigurație finală completă:")
    for key, value in config.items():
        print(f"- {key}: {value}")
    
    ascii_message = input("\nIntroduceți mesajul ASCII: ")
    binary_message = ascii_to_binary(ascii_message)
    
    print(f"\nMesaj ASCII: {ascii_message}")
    print(f"Mesaj binar: {binary_message}")
    
    print("\nÎncepere simulare transmisie retrocauzală...")
    received_binary, probabilities = channel.simulate_transmission(binary_message)
    received_ascii = binary_to_ascii(received_binary)
    
    print("\nRezultate finale:")
    print(f"Mesaj ASCII transmis:    {ascii_message}")
    print(f"Mesaj ASCII primit:      {received_ascii}")
    print(f"Mesaj binar transmis:    {binary_message}")
    print(f"Mesaj binar primit:      {received_binary}")
    print(f"Număr total biți:        {len(binary_message)}")
    
    correct_bits = sum(1 for a, b in zip(binary_message, received_binary) if a == b)
    accuracy = (correct_bits / len(binary_message)) * 100
    
    print(f"Biți transmiși corect:   {correct_bits}")
    print(f"Acuratețe:               {accuracy:.2f}%")
    print(f"Probabilitate medie:     {np.mean(probabilities):.2f}%")
    
    channel.plot_results(binary_message, probabilities)

if __name__ == "__main__":
    main()
