Documentation
use crate::event::{FriendMessageEvent, GroupMessageEvent};
use crate::plugin::cast_ref;
use atri_ffi::contact::FFIMember;
use atri_ffi::ffi::ForFFI;

use atri_ffi::message::FFIMessageChain;
use atri_ffi::ManagedCloneable;
use std::sync::atomic::{AtomicBool, Ordering};

pub extern "C" fn event_intercept(intercepted: *const ()) {
    let intercepted: &AtomicBool = cast_ref(intercepted);
    intercepted.store(true, Ordering::Relaxed);
}

pub extern "C" fn event_is_intercepted(intercepted: *const ()) -> bool {
    let intercepted: &AtomicBool = cast_ref(intercepted);
    intercepted.load(Ordering::Relaxed)
}

pub extern "C" fn group_message_event_get_group(event: *const ()) -> ManagedCloneable {
    let event: &GroupMessageEvent = cast_ref(event);
    ManagedCloneable::from_value(event.group().clone())
}

pub extern "C" fn group_message_event_get_message(event: *const ()) -> FFIMessageChain {
    let event: &GroupMessageEvent = cast_ref(event);
    let chain = event.message().clone();
    chain.into_ffi()
}

pub extern "C" fn group_message_event_get_sender(event: *const ()) -> FFIMember {
    let event: &GroupMessageEvent = cast_ref(event);
    let sender = event.sender();
    sender.into_ffi()
}

pub extern "C" fn friend_message_event_get_friend(event: *const ()) -> ManagedCloneable {
    let event: &FriendMessageEvent = cast_ref(event);
    ManagedCloneable::from_value(event.friend().clone())
}

pub extern "C" fn friend_message_event_get_message(event: *const ()) -> FFIMessageChain {
    let event: &FriendMessageEvent = cast_ref(event);
    let chain = event.message().clone();
    chain.into_ffi()
}