use std::rc::Rc;

use iri_string::types::UriAbsoluteString;
use napi::bindgen_prelude::{External, FunctionCallContext};
use napi::threadsafe_function::ThreadsafeFunction;

use crate::vscode_sys;

pub struct Arguments {
    pub uri: UriAbsoluteString,
    pub event_emitter_reference: Rc<vscode_sys::reference::EventEmitterRef>,
}

pub type Prototype =
    ThreadsafeFunction<External<Arguments>, (), External<Arguments>, napi::Status, false, false, 0>;

pub fn build(env: &napi::Env) -> Result<Prototype, napi::Error> {
    env.create_function_from_closure("fire_event", callback)?
        .build_threadsafe_function()
        .build()
}

fn callback(function_call_context: FunctionCallContext) -> Result<(), napi::Error> {
    let (external,): (&External<Arguments>,) = function_call_context.args()?;
    let Arguments {
        uri,
        event_emitter_reference,
    } = &**external;

    let event_emitter = event_emitter_reference.get_inner(function_call_context.env)?;
    let vscode_uri = crate::uri::to_vscode(function_call_context.env, uri)?;

    event_emitter.fire(vscode_uri.inner)
}