from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit.visualization import plot_histogram
import matplotlib.pyplot as plt


# === PASUL 1: Generăm o pereche entaglată (Bell pair)
def create_bell_pair():
    qc = QuantumCircuit(2, name="Bell Pair")
    qc.h(0)            # Aplicăm H lui q0
    qc.cx(0, 1)        # CNOT între q0 și q1
    return qc

# === PASUL 2: Operație în "viitor" pe qubit-ul 1 (B)
def apply_future_operation(qc, bit):
    """
    Emulează aplicarea unei informații binare din viitor:
    - 0 → nu facem nimic (I)
    - 1 → aplicăm X (flips the state)
    """
    if bit == 1:
        qc.x(1)

# === PASUL 3: Măsurăm qubit-ul A (q0) pentru a extrage informația
def measure_present(qc):
    qc.measure([0], [0])  # Doar qubitul A este măsurat în prezent
    return qc

# === TESTAM TRANSMITEREA RETROCAUSALĂ ===
def test_trc(bit):
    qc = QuantumCircuit(2, 1)  # 2 qubiti, 1 clasic

    # Pas 1: Crează perechea Bell
    qc.append(create_bell_pair(), [0, 1])

    # Pas 2: Simulăm aplicația informației în viitor
    apply_future_operation(qc, bit)

    # Pas 3: Măsurăm doar qubit-ul A (prezent)
    measure_present(qc)

    # Rulăm simularea cu noul API
    simulator = AerSimulator()
    result = simulator.run(qc, shots=1000).result()
    counts = result.get_counts()

    print(f"Rezultate pentru bitul {bit}: {counts}")
    plot_histogram(counts).show()
    plt.show()

    # Decodificare simplificată
    if '1' in counts and counts['1'] > counts.get('0', 0):
        decoded_bit = 1
    else:
        decoded_bit = 0

    print(f"Bit decodificat: {decoded_bit} | Corect? {decoded_bit == bit}")

# === DEMONSTRARE ===
test_trc(bit=1)  # Trimitem bitul 1 din viitor
test_trc(bit=0)  # Trimitem bitul 0 din viitor
