/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * 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.
 */

@!namespace("@ohos.multimodalInput.inputEventClient", "inputEventClient")
from ohos.multimodalInput.touchEvent use TouchEvent;
from ohos.multimodalInput.mouseEvent use MouseEvent, Button, Axis;
from ohos.multimodalInput.keyCode use KeyCode;
@!sts_inject("""
static { loadLibraryWithPermissionCheck("InputEventClient.z", "@ohos.multimodalInput.inputEventClient") }
""")

struct KeyEvent {
    isPressed: bool;
    keyCode: i32;
    keyDownDuration: i32;
    isIntercepted: bool;
}

struct TouchEventData {
    touchEvent: TouchEvent;
    useGlobalCoordinate: Optional<bool>;
}

struct MouseEventData {
    mouseEvent: MouseEvent;
    useGlobalCoordinate: Optional<bool>;
}

struct KeyEventData {
    keyEvent: KeyEvent;
}

struct KeyEventInfo {
    KeyEvent: KeyEvent;
}

@rename("injectKeyEvent")
function InjectKeyEventSync(keyEvent: KeyEventData): void;
@rename("injectEvent")
function InjectEventSync(keyEvent: KeyEventInfo): void;
@rename("injectMouseEvent")
function InjectMouseEventSync(mouseEvent: MouseEventData): void;
@rename("injectTouchEvent")
function InjectTouchEventSync(touchEvent: TouchEventData): void;
@rename("permitInjection")
function PermitInjectionSync(result: bool): void;

interface MouseController {
    @promise @rename("moveTo")
    MoveToSync(displayId: i32, displayX: i32, displayY: i32): void;
 
    @promise @rename("pressButton")
    PressButtonSync(button: Button): void;
 
    @promise @rename("releaseButton")
    ReleaseButtonSync(button: Button): void;
 
    @promise @rename("beginAxis")
    BeginAxisSync(axis: Axis, value: i32): void;

    @promise @rename("updateAxis")
    UpdateAxisSync(axis: Axis, value: i32): void;

    @promise @rename("endAxis")
    EndAxisSync(axis: Axis): void;
}
 
@promise @rename("createMouseController")
function CreateMouseControllerSync():MouseController;

struct TouchPoint {
    id: i32;
    displayId: i32;
    displayX: i32;
    displayY: i32;
}

interface TouchController {
    @promise @rename("touchDown")
    TouchDownSync(touch: TouchPoint): void;

    @promise @rename("touchMove")
    TouchMoveSync(touch: TouchPoint): void;

    @promise @rename("touchUp")
    TouchUpSync(touch: TouchPoint): void;
}

@promise @rename("createTouchController")
function CreateTouchControllerSync():TouchController;
 
interface KeyboardController {
    @promise @rename("pressKey")
    PressKeySync(keyCode: KeyCode): void;
 
    @promise @rename("releaseKey")
    ReleaseKeySync(keyCode: KeyCode): void;
}
 
@promise @rename("createKeyboardController")
function CreateKeyboardControllerSync():KeyboardController;