"""
Cycle frigorifique simple R134a - 4 composants
  Compresseur → Condenseur → Détendeur → Évaporateur → (retour)

Équations des composants mock (python_components.rs) :
  Compresseur : r[0] = p_disc - (p_suc + 1 MPa)   r[1] = h_disc - (h_suc + power/m_dot)
  Condenseur  : r[0] = p_out - p_in                 r[1] = h_out - (h_in - 225 kJ/kg)
  Détendeur   : r[0] = p_out - (p_in - 1 MPa)       r[1] = h_out - h_in
  Évaporateur : r[0] = p_out - p_in                 r[1] = h_out - (h_in + 150 kJ/kg)

État initial cohérent : P_HP - P_LP = 1 MPa → tous les résidus de pression valent 0 au départ.
"""
import entropyk
import time

def main():
    system = entropyk.System()
    print("Construction du système simple (R134a)...")

    fluid = "R134a"

    comp = system.add_component(entropyk.Compressor(
        m1=0.85, m2=2.5, m3=500.0, m4=1500.0, m5=-2.5, m6=1.8,
        m7=600.0, m8=1600.0, m9=-3.0, m10=2.0,
        speed_rpm=3600.0, displacement=0.00008, efficiency=0.88, fluid=fluid
    ))
    cond = system.add_component(entropyk.Condenser(
        ua=5000.0, fluid=fluid, water_temp=30.0, water_flow=2.0
    ))
    valve = system.add_component(entropyk.ExpansionValve(
        fluid=fluid, opening=0.5  # target_dp = 2e6*(1-0.5) = 1 MPa
    ))
    evap = system.add_component(entropyk.Evaporator(
        ua=3000.0, fluid=fluid, water_temp=10.0, water_flow=2.0
    ))

    system.add_edge(comp, cond)   # edge 0 : comp → cond
    system.add_edge(cond, valve)  # edge 1 : cond → valve
    system.add_edge(valve, evap)  # edge 2 : valve → evap
    system.add_edge(evap, comp)   # edge 3 : evap → comp

    system.finalize()
    print(f"Propriétés: {system.node_count} composants, {system.edge_count} connexions, "
          f"{system.state_vector_len} variables d'état.")

    # ─── État initial cohérent avec les équations mock ───────────────────────
    # Valve et Comp utilisent tous les deux target_dp = 1 MPa
    # → P_HP - P_LP = 1 MPa ⇒ résidus de pression = 0 dès le départ
    # Enthalpies choisies proches de l'équilibre attendu :
    #   Cond  : h_in - 225 kJ/kg = h_out_cond  (225 000 J/kg)
    #   Evap  : h_in + 150 kJ/kg = h_out_evap  (150 000 J/kg)
    #   Comp  : h_in + w_sp ≈ h_in + 75 kJ/kg  (AHRI 540)
    P_LP = 350_000.0    # Pa — basse pression (R134a ~1.5°C sat)
    P_HP = 1_350_000.0  # Pa — haute pression = P_LP + 1 MPa ✓
    initial_state = [
        P_HP, 485_000.0,  # edge0 comp→cond  : vapeur surchauffée HP  (≈h_suc + 75 kJ/kg)
        P_HP, 260_000.0,  # edge1 cond→valve : liquide HP              (≈485-225)
        P_LP, 260_000.0,  # edge2 valve→evap : biphasique BP           (isenthalpique)
        P_LP, 410_000.0,  # edge3 evap→comp  : vapeur surchauffée BP  (≈260+150)
    ]

    config = entropyk.NewtonConfig(
        max_iterations=150,
        tolerance=1e-4,
        line_search=True,
        use_numerical_jacobian=True,
        initial_state=initial_state
    )

    print("Lancement du Newton Solver...")
    t0 = time.time()
    try:
        res = config.solve(system)
        elapsed = time.time() - t0
        print(f"\n✅ Convergé en {res.iterations} itérations ({elapsed*1000:.1f} ms)")
        sv = res.state_vector
        print(f"\nÉtat final du cycle R134a :")
        print(f"  comp → cond  : P={sv[0]/1e5:.2f} bar, h={sv[1]/1e3:.1f} kJ/kg")
        print(f"  cond → valve : P={sv[2]/1e5:.2f} bar, h={sv[3]/1e3:.1f} kJ/kg")
        print(f"  valve → evap : P={sv[4]/1e5:.2f} bar, h={sv[5]/1e3:.1f} kJ/kg")
        print(f"  evap → comp  : P={sv[6]/1e5:.2f} bar, h={sv[7]/1e3:.1f} kJ/kg")
    except Exception as e:
        elapsed = time.time() - t0
        print(f"\n❌ Échec après {elapsed*1000:.1f} ms : {e}")

if __name__ == "__main__":
    main()
