# Use the existing connected PyFluent variable solver.
task_directory = r"C:\Users\13977\AppData\Local\FluentAGI\data\runs\20261018-132649-faae55"
settings = solver.settings

if settings.setup.models.is_active():
    settings.file.write_case_data(
        file_name=task_directory + r"\before_dust_demo.cas.h5"
    )

mesh = fluentagi.build_dust_box(directory=task_directory)
print("DUST_BOX_MESH", mesh)

settings = solver.settings
settings.file.read_mesh(file_name=mesh["mesh_file"])
settings.mesh.check()
if not settings.setup.models.is_active():
    raise RuntimeError("读取三维粉尘箱网格后模型未激活。")

transcript_started = False
try:
    settings.file.start_transcript(
        file_name=task_directory + r"\dust_transient.trn"
    )
    transcript_started = True

    settings.setup.general.solver.type = "pressure-based"
    settings.setup.models.multiphase.models = "none"
    settings.setup.models.viscous.model = "laminar"
    settings.setup.models.energy.enabled = False

    air = settings.setup.materials.fluid["air"]
    air.density.set_state({"option": "constant", "value": 1.225})
    air.viscosity.set_state({"option": "constant", "value": 1.7894e-5})
    print("AIR_READBACK", air.get_state())

    zones = settings.setup.cell_zone_conditions.fluid
    names = zones.get_object_names()
    if not names:
        raise RuntimeError("网格中没有流体单元区。")
    for name in names:
        zones[name].general.material = "air"

    boundaries = settings.setup.boundary_conditions
    print("BOUNDARIES_BEFORE", boundaries.get_state())
    inlet = boundaries.velocity_inlet["inlet"]
    inlet.momentum.velocity_specification_method = "Magnitude, Normal to Boundary"
    inlet.momentum.velocity.set_state({"option": "value", "value": 0.1})
    outlet = boundaries.pressure_outlet["outlet"]
    outlet.momentum.gauge_pressure.set_state(
        {"option": "value", "value": 0.0}
    )
    for name in boundaries.wall.get_object_names():
        wall = boundaries.wall[name]
        wall.momentum.wall_motion = "Stationary Wall"
        wall.momentum.shear_condition = "No Slip"

    configuration = fluentagi.configure_transient_dust(
        directory=task_directory,
        region_min=[0.012, 0.003, 0.012],
        region_max=[0.028, 0.004, 0.028],
        counts=[2, 2, 2],
        release_time=0.02,
        release_duration=0.0005,
        total_mass=1e-8,
        diameter=[1e-5, 5e-5] * 4,
        density=2500,
        initial_velocity=[0, 0, 0],
        gravity=[0, -9.81, 0],
        time_step=0.004,
        wall_behavior="trap",
    )
    print("CONFIGURATION_RESULT", configuration)
    if "needs_review" in str(configuration):
        raise RuntimeError("瞬态颗粒配置需要检查，停止初始化。")

    print("INLET_READBACK", inlet.get_state())
    print("OUTLET_READBACK", outlet.get_state())
    print("MODELS_READBACK", settings.setup.models.get_state())
    print("CAPTION", "预先释放悬浮颗粒，非积尘再悬浮")
    print(
        "8个标记代表加权颗粒包；"
        "标记数量及显示大小不代表真实颗粒数量和直径。"
        "层流模型包含解析平流和重力沉降，未包含随机湍流扩散。"
    )

    initialization = fluentagi.initialize_transient_dust(
        directory=task_directory
    )
    print("INITIALIZATION_RESULT", initialization)
    if "needs_review" in str(initialization):
        raise RuntimeError("初始化结果需要检查，停止推进。")

    target_time = 0.2
    reached_target = False
    needs_review = False
    previous_time = 0.0

    for batch in range(1, 5):
        result = fluentagi.advance_transient_dust(
            directory=task_directory,
            until_time=target_time,
            max_iter_per_step=200,
            residual_tolerance=0.001,
        )
        print("ADVANCE_RESULT", batch, result)
        if "needs_review" in str(result):
            needs_review = True
            break
        if result.get("final_time") is None:
            needs_review = True
            print("REVIEW_REASON", "返回值缺少实际 final_time。")
            break
        actual_time = float(result["final_time"])
        if actual_time >= target_time - 1e-10:
            reached_target = True
            break
        if actual_time <= previous_time + 1e-12:
            needs_review = True
            print("REVIEW_REASON", "实际物理时间没有推进。")
            break
        previous_time = actual_time

    native_state = fluentagi.read_transient_dust(
        directory=task_directory
    )
    print("NATIVE_PARTICLES_AND_MASS_BUDGET", native_state)
    saved_results = fluentagi.read_transient_dust_results(
        directory=task_directory
    )
    print("SAVED_RESULTS_AND_PREVIEWS", saved_results)
    print("TARGET_REACHED", reached_target)
    print("NEEDS_REVIEW", needs_review)

    settings.file.write_case_data(
        file_name=task_directory + r"\dust_current.cas.h5"
    )
    print(
        "检查原生返回的沉积或捕获、逃逸、域内、未完成、"
        "中止、尚未释放颗粒包及各项质量预算。"
        "任何 needs_review 均不表示计算通过。"
        "后续续算使用本任务原目录和已保存检查点，不重新初始化。"
        "动画和预览文件以瞬态适配器实际输出为准。"
    )

finally:
    if transcript_started:
        settings.file.stop_transcript()