// Copyright 2025 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
///|
extern "js" fn set_viewport_height(
elem : @dom.HTMLCanvasElement,
height : Double,
) -> Unit = "(x, y) => { x.height = y; }"
///|
extern "js" fn set_viewport_width(
elem : @dom.HTMLCanvasElement,
width : Double,
) -> Unit = "(x, y) => { x.width = y; }"
///|
extern "js" fn request_pointer_lock_if_enabled(
elem : @dom.HTMLCanvasElement,
enabled : Bool,
) -> Unit = "(elem, enabled) => { if (enabled && document.pointerLockElement !== elem) { elem.requestPointerLock(); } }"
///|
extern "js" fn is_pointer_locked(canvas : @dom.HTMLCanvasElement) -> Bool = "(canvas) => document.pointerLockElement === canvas"
///|
extern "js" fn exit_pointer_lock() -> Unit = "() => { if (document.exitPointerLock) { document.exitPointerLock(); } }"
///|
extern "js" fn document_add_event_listener(
event : String,
callback : (@dom.Event) -> Unit,
) -> Unit = "(event, callback) => { document.addEventListener(event, callback); }"
///|
extern "js" fn document_hidden() -> Bool = "() => document.hidden"
///|
extern "js" fn prevent_default_event(event : @dom.Event) -> Unit = "(event) => event.preventDefault()"
///|
extern "js" fn load_font_async(
font : String,
path : String,
accept : () -> Bool,
installed : () -> Unit,
failed : (String) -> Unit,
) -> Unit =
#| (font, path, accept, installed, failed) => {
#| const ff = new FontFace(font, 'url(' + path + ')');
#| ff.load().then(loadedFont => {
#| if (!accept()) return;
#| const faces = globalThis.__selene_font_faces ??
#| (globalThis.__selene_font_faces = new Map());
#| const previous = faces.get(font);
#| if (previous) document.fonts.delete(previous);
#| document.fonts.add(loadedFont);
#| faces.set(font, loadedFont);
#| installed();
#| }).catch(error => {
#| failed(error && error.message ? String(error.message) : String(error));
#| });
#| }