using System.ComponentModel;

namespace io.github.hatayama.uLoopMCP
{
    public class SimulateMouseUiSchema : BaseToolSchema
    {
        [Description("Mouse action: Click(0) - click with selected Button, Drag(1) - one-shot drag, DragStart(2) - begin drag and hold, DragMove(3) - move while holding drag, DragEnd(4) - release drag, LongPress(5) - press and hold for Duration seconds")]
        public MouseAction Action { get; set; } = MouseAction.Click;

        [Description("Target X position in screen pixels (origin: top-left). For Drag action, this is the destination.")]
        public float X { get; set; } = 0f;

        [Description("Target Y position in screen pixels (origin: top-left). For Drag action, this is the destination.")]
        public float Y { get; set; } = 0f;

        [Description("Start X position in screen pixels for Drag action (origin: top-left). Drag starts here and moves to X,Y.")]
        public float FromX { get; set; } = 0f;

        [Description("Start Y position in screen pixels for Drag action (origin: top-left). Drag starts here and moves to X,Y.")]
        public float FromY { get; set; } = 0f;

        [Description("Drag speed in pixels per second (0 for instant). Applies to Drag, DragMove, and DragEnd actions.")]
        public float DragSpeed { get; set; } = McpConstants.SIMULATE_MOUSE_UI_DEFAULT_DRAG_SPEED;

        [Description("Hold duration in seconds for LongPress action (default: 0.5).")]
        public float Duration { get; set; } = 0.5f;

        [Description("Mouse button: Left(0, default), Right(1), Middle(2).")]
        public MouseButton Button { get; set; } = MouseButton.Left;

        [Description("Bypass EventSystem raycast and send click, long-press, or drag events directly to TargetPath, or DropTargetPath for DragEnd. Useful for interacting with UI behind a raycast-blocking overlay.")]
        public bool BypassRaycast { get; set; } = false;

        [Description("Hierarchy path of the target GameObject used by Click, LongPress, Drag, and DragStart when BypassRaycast is true, for example Canvas/Panel/Button.")]
        public string TargetPath { get; set; } = "";

        [Description("Optional hierarchy path of the drop target used by Drag and DragEnd, for example Canvas/DropZone.")]
        public string DropTargetPath { get; set; } = "";
    }
}
