from pylinac.core.geometry import sin, cos
from pylinac.core.image_generator import AS1200Image, PerfectFieldLayer, GaussianFilterLayer, \
    generate_winstonlutz_multi_bb_multi_field
from pylinac.winston_lutz import WinstonLutzMultiTargetMultiField, BBConfig

mtmf = 'mtmf'
generate_winstonlutz_multi_bb_multi_field(
    simulator=AS1200Image(1000),
    field_layer=PerfectFieldLayer,
    final_layers=[GaussianFilterLayer(sigma_mm=1),],
    dir_out=mtmf,
    field_offsets=(  # left, up, in
        (0, 5, 0),
        (0, 0, -60),
        (10, 10, -30),
        (0, 0, 30),
    ),
    bb_offsets=(
        (0, 5, 0),
        (-60*sin(5), 0, -60*cos(5)),
        (30*sin(5), 0, 30*cos(5)),
        (10-30*sin(5), 10, -30/cos(5)),
    ),
    field_size_mm=(20, 20),
    bb_size_mm=5,
    align_to_pixels=False,
    image_axes=(
        (0, 0, 0),
        (90, 0, 0),
        (180, 0, 0),
        (270, 0, 0),
        (0, 0, 90),
        (0, 0, 45),
        (0, 0, 270),
        (0, 0, 315),
    )
)

BBA = (
    BBConfig(
        name='Iso',
        offset_left_mm=0,
        offset_up_mm=5,
        offset_in_mm=0,
        bb_size_mm=5,
        rad_size_mm=20,
    ),
    BBConfig(
        name="Out",
        offset_left_mm=0,
        offset_up_mm=00,
        offset_in_mm=-60,
        bb_size_mm=5,
        rad_size_mm=20,
    ),
    BBConfig(
        name="In",
        offset_left_mm=0,
        offset_up_mm=00,
        offset_in_mm=30,
        bb_size_mm=5,
        rad_size_mm=20,
    ),
    BBConfig(
        name="Left/Out",
        offset_left_mm=10,
        offset_up_mm=10,
        offset_in_mm=-30,
        bb_size_mm=5,
        rad_size_mm=20,
    ),
)

wl = WinstonLutzMultiTargetMultiField(mtmf)
wl.analyze(bb_arrangement=BBA)
wl.plot_location()