#![allow(dead_code)]
#[allow(unused)]
use crate::*;
use pax_engine::api::*;
use pax_engine::*;
const IN_OUT_TIME: u64 = 10;
#[pax]
#[engine_import_path("pax_engine")]
#[inlined(
    if self.shown {
        <Group x=100% y={y_pos} width=400px height={height}>
            <Group x=50% y=50% width={100%-20px} height={100%-20px}>
                <Text x=40px height=100% width=70% text=message align={TextAlignHorizontal::Left}/>
                <Button width=70px height=30px x=90% y=50% label="Undo" @button_click=handle_trigger/>
                <Rectangle fill=rgb(20, 20, 20)
                corner_radii={
                    RectangleCornerRadii::radii(15.0,15.0,15.0,15.0)
                }/>
            </Group>
        </Group>
    }
    @settings {
        @mount: on_mount
        @pre_render: pre_render
    }
)]
pub struct Toast {
    pub shown: Property<bool>,
    pub message: Property<String>,
    pub height: Property<Size>,
    pub y_pos: Property<Size>,
    pub signal: Property<bool>,
    pub on_message_changed: Property<bool>,
}
impl Toast {
    pub fn on_mount(&mut self, _ctx: &NodeContext) {
        self.height.set(Size::Pixels(80.into()));
        self.y_pos.set(Size::default() + self.height.get());
        let message = self.message.clone();
        let deps = [message.untyped()];
        let y_pos = self.y_pos.clone();
        let height = self.height.clone();
        self.shown.set(true);
        self.on_message_changed.replace_with(Property::computed(
            move || {
                if message.get() != "" {
                    set_px_offset(&y_pos, Size::ZERO(), IN_OUT_TIME);
                    set_px_offset_later(&y_pos, Size::ZERO(), 300);
                    set_px_offset_later(&y_pos, height.get(), IN_OUT_TIME);
                }
                false
            },
            &deps,
        ));
    }
    pub fn pre_render(&mut self, _ctx: &NodeContext) {
        self.on_message_changed.get();
    }
    pub fn handle_trigger(&mut self, _ctx: &NodeContext, _event: Event<ButtonClick>) {
        set_px_offset(&self.y_pos, self.height.get(), IN_OUT_TIME);
        self.signal.set(true);
    }
}
fn set_px_offset(y_pos: &Property<Size>, offset: Size, time: u64) {
    y_pos.ease_to(Size::default() + offset, time, EasingCurve::InQuad);
}
fn set_px_offset_later(y_pos: &Property<Size>, offset: Size, time: u64) {
    y_pos.ease_to_later(Size::default() + offset, time, EasingCurve::OutQuad);
}