use wasm_bindgen::prelude::*;
// use serde::{Serialize, Deserialize};
use kifu_core::{CoreRequest, CoreResponse};

#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_namespace = console)]
    pub fn log(s: &str);
}

/*
#[wasm_bindgen]
#[derive(Serialize, Deserialize)]
pub struct CoreRequest(kifu_core::Request);
*/

/*
#[wasm_bindgen]
impl CoreRequest {
    #[wasm_bindgen(constructor)]
    pub fn new(request: kifu_core::Request) -> Self {
        Self(request)
    }
}
*/

/* Somehow uncommenting this code actually causes the module to not load. Maybe a name conflict?
 * Don't know.
 */
/*
#[wasm_bindgen]
#[derive(Serialize, Deserialize)]
pub struct CoreResponse(kifu_core::Response);
*/

#[wasm_bindgen]
#[derive(Debug)]
pub struct CoreApp(kifu_core::CoreApp);

#[wasm_bindgen]
impl CoreApp {
    #[wasm_bindgen(constructor)]
    pub fn new() -> Self {
        Self(kifu_core::CoreApp::new())
    }

    #[wasm_bindgen]
    pub async fn dispatch(&self, param: &JsValue) -> JsValue {
        let request: CoreRequest = serde_wasm_bindgen::from_value(param.clone()).unwrap();
        serde_wasm_bindgen::to_value(&self.0.dispatch(request).await).unwrap()
    }
}