# Code automatically extracted from nominal_concrete_cover.ipynb.
from blueprints.checks.eurocode.concrete.nominal_concrete_cover import NominalConcreteCover
from blueprints.codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover.constants import (
    AbrasionClass,
    CastingSurface,
    NominalConcreteCoverConstants,
)
from blueprints.codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover.table_4_3 import Table4Dot3ConcreteStructuralClass
from blueprints.materials.concrete import ConcreteMaterial, ConcreteStrengthClass

concrete_material = ConcreteMaterial(concrete_class=ConcreteStrengthClass.C30_37)

structural_class = Table4Dot3ConcreteStructuralClass(
    exposure_classes=["XC1"],
    design_working_life=100,
    concrete_material=concrete_material,
    plate_geometry=False,
    quality_control=False,
)

calculation = NominalConcreteCover(
    reinforcement_diameter=32,
    nominal_max_aggregate_size=32,
    constants=NominalConcreteCoverConstants(),
    structural_class=structural_class,  # or by its number, for example 4 in the case of S4
    carbonation="XC1",
    delta_c_dur_gamma=10,
    delta_c_dur_add=0,
    casting_surface=CastingSurface.PREPARED_GROUND,
    uneven_surface=False,
    abrasion_class=AbrasionClass.NA,
)

print(
    f"Structural class: {structural_class}\n\n"
    f"C,min,dur: {calculation.c_min_dur()} mm\n"
    f"C,min,b: {calculation.c_min_b()} mm\n"
    f"C,min,total: {calculation.c_min_total()} mm\n"
    f"\tCover increase due to uneven surface: {calculation.cover_increase_for_uneven_surface()} mm\n"
    f"\tCover increase due to abrasion: {calculation.cover_increase_for_abrasion_class()} mm\n\n"
    f"Nominal concrete cover: {calculation.value()} mm\n"
    f"\tC,nom: {calculation.c_nom()} mm\n"
    f"\tMinimum cover with regard to casting surface: {calculation.minimum_cover_with_regard_to_casting_surface()} mm\n\n"
)

print(calculation.latex())
