import cantera as ct
import matplotlib.pyplot as plt
import numpy as np

# Ρύθμιση για καθαρά labels
plt.rcParams.update({'font.size': 12})

# 1. Φόρτωση μηχανισμού και ορισμός συνθηκών
gas = ct.Solution('gri30.yaml')
gas.TPX = 950, 50*ct.one_atm, 'H2:2, O2:1, N2:3.76'

r = ct.IdealGasReactor(gas, clone=False)
sim = ct.ReactorNet([r])

time = 0.0
states = ct.SolutionArray(gas, extra=['t'])

# 2. Προσομοίωση
for n in range(1000): # Αυξήσαμε λίγο τα βήματα για να σιγουρέψουμε ότι προλαβαίνει την ανάφλεξη
    time += 2e-5 
    sim.advance(time)
    states.append(r.phase.state, t=time*1e3) # t σε ms

# 3. Οπτικοποίηση
fig, ax = plt.subplots(2, 1, figsize=(10, 8), sharex=True)

# Πάνω γράφημα: Θερμοκρασία
ax[0].plot(states.t, states.T, color='firebrick', lw=2.5)
ax[0].set_ylabel(r'Temperature $T$ [K]', fontsize=14)
ax[0].set_title(f'Auto-ignition of $H_2/O_2$ at {gas.T:.0f} K', fontsize=16)
ax[0].grid(True, linestyle='--', alpha=0.7)

# Κάτω γράφημα: Μάζα Ριζών OH
ax[1].plot(states.t, states('OH').Y, label=r'$Y_{OH}$', color='royalblue', lw=2.5)
ax[1].set_xlabel(r'Time $t$ [ms]', fontsize=14)
ax[1].set_ylabel(r'Mass Fraction $Y_{i}$', fontsize=14)
ax[1].legend(loc='upper right')
ax[1].grid(True, linestyle='--', alpha=0.7)

# 4. Εύρεση χρόνου ανάφλεξης και Annotation
itign = np.argmax(np.diff(states.T)) # Δείκτης μέγιστης ανόδου
t_ign = states.t[itign]
T_ign = states.T[itign]

ax[0].annotate(f'Ignition at ~{t_ign:.2f} ms', 
             xy=(t_ign, T_ign), xytext=(t_ign + 1, T_ign - 500),
             arrowprops=dict(facecolor='black', shrink=0.05, width=1))

plt.tight_layout()
plt.show()

# 5. Εκτύπωση Κυρίαρχων Αντιδράσεων (Διορθωμένο για παλαιότερες εκδόσεις)
gas.TPY = states.T[itign], states.P[itign], states.Y[itign]

print(f"\nΚυρίαρχες αντιδράσεις στη στιγμή της έκρηξης (t = {t_ign:.3f} ms):")
print(f"{'Reaction':<40} | {'Net ROP [kmol/m3/s]':<20}")
print("-" * 65)

rop = gas.net_rates_of_progress
top_reactions = np.argsort(abs(rop))[-10:]

for i in reversed(top_reactions):
    # ΔΙΟΡΘΩΣΗ ΕΔΩ: Χρήση gas.reaction(i).equation αντί για reaction_string
    equation = gas.reaction(i).equation
    print(f"{equation:<40} | {rop[i]:.4e}")
