"""
de Broglie relation (p = h/λ).

Assertion-based CAS audit block.
Pillar: Particle Mechanics | Chain: constitutive postulate p=h/λ → photon dictionary check → wave number
CalRef: Math Appendix §4A, Particle Mechanics Calibration §3C
"""


def run():
    from sympy import symbols, simplify, pi, sqrt

    print('=== CAS AUDIT: F0028 — de Broglie relation ===\n')

    pass_count = 0
    fail_count = 0
    total_steps = 0

    h_pl, lambda_db, p_mom = symbols('h_pl lambda_db p_mom', real=True, positive=True)
    nu, c_light = symbols('nu c_light', real=True, positive=True)
    E_ph = symbols('E_ph', real=True, positive=True)
    k_wave = symbols('k_wave', real=True, positive=True)
    hbar = symbols('hbar', real=True, positive=True)

    # de Broglie postulate
    p_deBroglie = h_pl / lambda_db

    print('Section D: Step log')
    print('---------------------------------------------')

    # --- Step 1: Constitutive relation ---
    res1 = simplify(p_deBroglie * lambda_db - h_pl)
    total_steps += 1
    if simplify(res1) == 0:
        print('  Step 1  PASS — p·λ = h (constitutive relation)')
        pass_count += 1
    else:
        print('  Step 1  FAIL')
        fail_count += 1

    # --- Step 2: Wavelength from momentum ---
    lambda_from_p = h_pl / p_mom
    p_check = h_pl / lambda_from_p
    res2 = simplify(p_check - p_mom)
    total_steps += 1
    if simplify(res2) == 0:
        print('  Step 2  PASS — λ = h/p → p = h/λ (round-trip)')
        pass_count += 1
    else:
        print('  Step 2  FAIL')
        fail_count += 1

    # --- Step 3: Photon dictionary consistency ---
    E_photon = h_pl * nu
    lambda_photon = c_light / nu
    p_photon_energy = E_photon / c_light
    p_photon_deBroglie = h_pl / lambda_photon
    res3 = simplify(p_photon_energy - p_photon_deBroglie)
    total_steps += 1
    if simplify(res3) == 0:
        print('  Step 3  PASS — Photon: p = E/c = hν/c = h/λ (dictionary consistent)')
        pass_count += 1
    else:
        print('  Step 3  FAIL')
        fail_count += 1

    # --- Step 4: Wave number form ---
    p_wn_explicit = (h_pl / (2*pi)) * (2*pi / lambda_db)
    res4 = simplify(p_wn_explicit - p_deBroglie)
    total_steps += 1
    if simplify(res4) == 0:
        print('  Step 4  PASS — p = ℏk = h/λ (wave number form)')
        pass_count += 1
    else:
        print('  Step 4  FAIL')
        fail_count += 1

    # --- Step 5: Energy-momentum for photons ---
    E_from_p = p_deBroglie * c_light
    E_from_nu = h_pl * nu
    E_sub = E_from_p.subs(lambda_db, c_light/nu)
    res5 = simplify(E_sub - E_from_nu)
    total_steps += 1
    if simplify(res5) == 0:
        print('  Step 5  PASS — E = pc = hc/λ = hν (photon energy-momentum)')
        pass_count += 1
    else:
        print('  Step 5  FAIL')
        fail_count += 1

    # --- Step 6: Nonrelativistic kinetic energy ---
    m_part = symbols('m_part', real=True, positive=True)
    T_kin = p_deBroglie**2 / (2*m_part)
    T_expected = h_pl**2 / (2*m_part*lambda_db**2)
    res6 = simplify(T_kin - T_expected)
    total_steps += 1
    if simplify(res6) == 0:
        print('  Step 6  PASS — T = p²/(2m) = h²/(2mλ²)')
        pass_count += 1
    else:
        print('  Step 6  FAIL')
        fail_count += 1

    # --- Step 7: Numerical — electron at 100 eV ---
    h_val = 6.62607015e-34
    m_e = 9.1093837015e-31
    eV = 1.602176634e-19
    T_100eV = 100 * eV
    p_val = sqrt(2 * m_e * T_100eV)
    lambda_val = h_val / p_val
    lambda_expected_nm = 0.1226
    lambda_calc_nm = lambda_val * 1e9
    total_steps += 1
    if abs(lambda_calc_nm - lambda_expected_nm) < 0.005:
        print(f'  Step 7  PASS — 100 eV electron: λ = {lambda_calc_nm:.4f} nm (expected ≈ 0.123 nm)')
        pass_count += 1
    else:
        print('  Step 7  FAIL')
        fail_count += 1

    # --- Step 8: Numerical — photon at visible (550 nm) ---
    lambda_vis = 550e-9
    p_photon_val = h_val / lambda_vis
    p_expected = 1.205e-27
    total_steps += 1
    if abs(p_photon_val - p_expected)/p_expected < 0.01:
        print(f'  Step 8  PASS — 550 nm photon: p = {p_photon_val:.3e} kg·m/s')
        pass_count += 1
    else:
        print('  Step 8  FAIL')
        fail_count += 1

    # --- Step 9: Cross-block — F0013 wave quantization ---
    n_q = symbols('n_q', real=True, positive=True)
    L_box = symbols('L_box', real=True, positive=True)
    k_n = 2*pi*n_q / L_box
    p_n = (h_pl/(2*pi)) * k_n
    res9 = simplify(p_n - h_pl*n_q/L_box)
    pL = p_n * L_box
    res9b = simplify(pL - n_q*h_pl)
    total_steps += 1
    if simplify(res9) == 0 and simplify(res9b) == 0:
        print('  Step 9  PASS — p_n = hn/L, p·L = nh (consistent with F0013)')
        pass_count += 1
    else:
        print('  Step 9  FAIL')
        fail_count += 1

    # --- Step 10: Self-test — wrong relation ---
    p_wrong = h_pl * lambda_db
    res_wrong = simplify(p_wrong - p_deBroglie)
    total_steps += 1
    if not (simplify(res_wrong) == 0):
        print('  Step 10a PASS — Wrong p=h·λ detected as incorrect')
        pass_count += 1
    else:
        print('  Step 10a FAIL')
        fail_count += 1

    res_quant = simplify(res_wrong - h_pl*(lambda_db - 1/lambda_db))
    total_steps += 1
    if simplify(res_quant) == 0:
        print('  Step 10b PASS — Wrong residual = h(λ−1/λ) (quantified)')
        pass_count += 1
    else:
        print('  Step 10b FAIL')
        fail_count += 1

    print('---------------------------------------------\n')

    # ---- VERDICT ----
    print('=============================================')
    print('  F0028 AUDIT RESULT')
    print(f'  Steps: {total_steps}  |  Pass: {pass_count}  |  Fail: {fail_count}')
    if fail_count == 0:
        print('  STATUS: *** PASS ***')
    else:
        print(f'  STATUS: *** FAIL *** ({fail_count} step(s) failed)')
    print('=============================================')
    print(f'  ✓ F0028 — {pass_count}/{total_steps} PASS')


if __name__ == '__main__':
    run()
