import 'package:fixnum/fixnum.dart';
import 'package:webrtc_controller_flutter/proto/control_message.pb.dart';

/// 控制指令构造工具，对应 Android 端 RemoteTouchView 的指令格式。
///
/// 指令通过 DataChannel 以 protobuf 二进制（[ControlMessage]）发送，
/// 被控端（WebRTCControlled）的 InputCommandHandler 负责解析执行。
class ControlCommands {
  ControlCommands._();

  /// 单击指令。坐标 x/y 为相对于屏幕的百分比（0.0 ~ 1.0）。
  static ControlMessage touch(double x, double y) => ControlMessage(
        action: Action.TOUCH,
        x: x,
        y: y,
      );

  /// 滑动指令。坐标为相对百分比，duration 为毫秒。
  static ControlMessage swipe(
    double x1,
    double y1,
    double x2,
    double y2,
    int durationMs,
  ) =>
      ControlMessage(
        action: Action.SWIPE,
        x1: x1,
        y1: y1,
        x2: x2,
        y2: y2,
        duration: Int64(durationMs),
      );

  /// 按键指令。action: 0=按下, 1=抬起（对应 Android KeyEvent.ACTION_DOWN/UP）。
  static ControlMessage key(int keyCode, int action) => ControlMessage(
        action: Action.KEY,
        keyCode: keyCode,
        keyAction: action,
      );

  /// 长按指令。坐标 x/y 为相对于屏幕的百分比（0.0 ~ 1.0）。
  /// 对应 Android 端 RemoteTouchView.createLongPressCommand。
  static ControlMessage longPress(double x, double y) => ControlMessage(
        action: Action.LONG_PRESS,
        x: x,
        y: y,
      );

  /// 原始 MotionEvent 指令，用于实现“实时跟手”。
  /// action: 0=DOWN, 1=UP, 2=MOVE（对应 Android MotionEvent.ACTION_XXX）。
  static ControlMessage motionEvent(int action, double x, double y) =>
      ControlMessage(
        action: Action.MOTION_EVENT,
        motionAction: action,
        x: x,
        y: y,
      );

  /// 分辨率切换指令。
  /// [width] 目标长边/宽度（<=0 表示被控端原生分辨率）；
  /// [height] 目标高度（<=0 时由被控端按屏幕宽高比计算）；
  /// [fps] 目标帧率（<=0 表示沿用当前帧率）。
  static ControlMessage setResolution(int width, int height, int fps) =>
      ControlMessage(
        action: Action.SET_RESOLUTION,
        width: width,
        height: height,
        fps: fps,
      );

  /// 串流模式切换指令。
  /// [mode] 为 0=WebRTC 全托管 / 1=自编码（自建 MediaCodec 编解码 + video DataChannel 裸流透传）。
  static ControlMessage streamMode(int mode) => ControlMessage(
        action: Action.SET_STREAM_MODE,
        streamMode: mode,
      );
}
