use rosc::OscType;
use std::net::{SocketAddr, UdpSocket};
use gled_model::patching::layout::LayoutSelection;
use crate::storage::asset::scene::instance::SceneInstance;
use super::{osc_int, send_feedback};
pub(super) fn send_scene_instance_feedback(
socket: &UdpSocket,
addr: SocketAddr,
prefix: &str,
scene: &SceneInstance,
) {
send_feedback(
socket,
addr,
&format!("{prefix}/active"),
vec![OscType::Bool(scene.active)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/opacity"),
vec![OscType::Float(scene.opacity.multiplier)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/name"),
vec![OscType::String(scene.name.clone())],
);
send_feedback(
socket,
addr,
&format!("{prefix}/color"),
vec![OscType::String(scene.color.to_string())],
);
send_feedback(
socket,
addr,
&format!("{prefix}/input_dimmer"),
vec![OscType::Float(scene.input_dimmer)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/ignore_main_dimmer"),
vec![OscType::Bool(scene.ignore_main_dimmer)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/beat_offset"),
vec![OscType::Float(scene.beat_progression_offset.multiplier)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/set_offset_on_flash"),
vec![OscType::Bool(scene.set_offset_on_flash)],
);
let effects = &scene.scene.effects;
send_feedback(
socket,
addr,
&format!("{prefix}/effect/count"),
vec![osc_int(effects.len())],
);
for (i, effect) in effects.iter().enumerate() {
send_feedback(
socket,
addr,
&format!("{prefix}/effect/{i}/opacity"),
vec![OscType::Float(effect.opacity.multiplier)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/effect/{i}/color_shift"),
vec![OscType::Float(effect.color_shift.multiplier)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/effect/{i}/beat_progression"),
vec![OscType::Float(effect.beat_progression.multiplier)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/effect/{i}/beat_offset"),
vec![OscType::Float(effect.beat_progression_offset.multiplier)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/effect/{i}/speed_exponent"),
vec![OscType::Int(effect.speed_exponent)],
);
send_feedback(
socket,
addr,
&format!("{prefix}/effect/{i}/layout"),
vec![layout_feedback(effect.selection)],
);
}
}
pub(super) fn layout_feedback(selection: Option<LayoutSelection>) -> OscType {
selection.map_or(OscType::Int(-1), |selection| {
osc_int(selection.layout.stack_index())
})
}