
import flow360 as fl
from flow360.component.simulation.unit_system import u
from flow360.examples import OM6wing

OM6wing.get_files()

project = fl.Project.from_volume_mesh(OM6wing.mesh_filename, name="Wall roughness")

vm = project.volume_mesh

with fl.SI_unit_system:
    params = fl.SimulationParams(
        reference_geometry=fl.ReferenceGeometry(
            area=1.15315084119231,
            moment_center=[0, 0, 0],
            moment_length=[1.47602, 0.801672958512342, 1.47602],
        ),
        operating_condition=fl.AerospaceCondition(
            velocity_magnitude=286, alpha=10 * fl.u.deg
        ),
        time_stepping=fl.Steady(max_steps=2000),
        outputs=[
            fl.SliceOutput(
                entities=[
                    *[
                        fl.Slice(
                            name=f"slice_y_{name}",
                            normal=(0, 1, 0),
                            origin=(0, y, 0),
                        )
                        for name, y in zip(
                            ["0_2", "0_4", "0_6", "0_8"], [0.2, 0.4, 0.6, 0.8]
                        )
                    ]
                ],
                output_fields=[
                    "velocity",
                    "velocity_x",
                    "velocity_y",
                    "velocity_z",
                    "Cp",
                ],
            ),
        ],
    )

with fl.SI_unit_system:
    params.models = [
        fl.Wall(surfaces=vm["1"], roughness_height=1e-4 * fl.u.m),
        fl.SlipWall(surfaces=vm["2"]),
        fl.Freestream(surfaces=vm["3"]),
    ]

case_1 = project.run_case(params, "With wall roughness")

params.models[0].roughness_height = 0 * fl.u.m

case_2 = project.run_case(params, "Without wall roughness")

cases = [case_1, case_2]

for case in cases:
    case.wait()

avg = fl.report.Average(fraction=0.1)
CD = fl.report.DataItem(data="surface_forces/totalCD", title="CD", operations=avg)
CL = fl.report.DataItem(data="surface_forces/totalCL", title="CL", operations=avg)

side_camera = fl.report.Camera(
    position=(0, -1, 0),
    look_at=(0, 0, 0),
    up=(0, 0, 1),
    pan_target=(0.55, 0, 0.0),
    dimension=1.2,
    dimension_dir="width",
)
top_camera = fl.report.TopCamera(
    pan_target=(0.55, 0.75, 0.0), dimension=1.5, dimension_dir="height"
)

coefficients_table = fl.report.Table(
    data=[CD, fl.report.Delta(data=CD), CL, fl.report.Delta(data=CL)],
    section_title="Statistical data",
)

y_slice = fl.report.Chart3D(
    section_title="Velocity Slice at y=0.2m",
    items_in_row=2,
    force_new_page=True,
    show="slices",
    include=["slice_y_0_2"],
    field="velocity",
    limits=(100 * u.m / u.s, 450 * u.m / u.s),
    camera=side_camera,
    fig_name="slice_y_0_2",
)

surface_lic = fl.report.Chart3D(
    section_title="Surface CfVec",
    items_in_row=2,
    force_new_page=True,
    show="boundaries",
    field="CfVec",
    mode="lic",
    limits=(0, 0.013),
    camera=top_camera,
    fig_name="surface_lic",
)

report = fl.report.ReportTemplate(
    title="Wall roughness comparison",
    items=[
        coefficients_table,
        y_slice,
        surface_lic,
    ],
    settings=fl.report.Settings(dpi=150),
)

report = report.create_in_cloud(
    "Wall roughness comparison",
    cases,
    solver_version="release-25.7.1",
)

report.wait()
report.download("report.pdf")
