using System.Threading.Tasks;

namespace Plane.Copters
{
    public interface ICopterActionsSharedByCopterManager
    {
        /// <summary>
        /// 断开与飞行器之间的连接。
        /// </summary>
        /// <returns>表示此异步操作的 <see cref="Task"/> 实例。</returns>
        Task DisconnectAsync();

        /// <summary>
        /// 切换到 <see cref="CopterState.FloatMode"/> 并向各个控制通道发中间值。飞行器可能受风等外力影响而在水平方向上飘动。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task FloatAsync();

        /// <summary>
        /// 使飞行器飞往水平面上指定的点。
        /// </summary>
        /// <param name="lat">纬度。</param>
        /// <param name="lng">经度。</param>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task FlyToAsync(double lat, double lng);

        /// <summary>
        /// 使飞行器飞往指定的点。
        /// </summary>
        /// <param name="lat">纬度。</param>
        /// <param name="lng">经度。</param>
        /// <param name="alt">相对于解锁点的高度。</param>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task FlyToAsync(double lat, double lng, float alt);

        /// <summary>
        /// 切换到 <see cref="CopterState.HoverMode"/> 并悬停。此操作需要使用 GPS 定位，卫星数不足导致定位不准时非常危险。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task HoverAsync();

        Task GuidAsync();
        /// <summary>
        /// 降落。此操作需要使用 GPS 定位，卫星数不足导致定位不准时非常危险。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task LandAsync();

        /// <summary>
        /// 锁定飞行器（停止电机转动）。在调用之前务必判断高度及让软件使用者确认！
        /// </summary>
        Task LockAsync();

        /// <summary>
        /// 返航。此操作需要使用 GPS 定位，卫星数不足导致定位不准时非常危险。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task ReturnToLaunchAsync();

        /// <summary>
        /// 用指定的值设置通道。
        /// </summary>
        /// <param name="ch1">通道 1 的目标值。</param>
        /// <param name="ch2">通道 2 的目标值。</param>
        /// <param name="ch3">通道 3 的目标值。</param>
        /// <param name="ch4">通道 4 的目标值。</param>
        /// <param name="ch5">通道 5 的目标值。</param>
        /// <param name="ch6">通道 6 的目标值。</param>
        /// <param name="ch7">通道 7 的目标值。</param>
        /// <param name="ch8">通道 8 的目标值。</param>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task SetChannelsAsync(ushort? ch1 = null, ushort? ch2 = null, ushort? ch3 = null, ushort? ch4 = null, ushort? ch5 = null, ushort? ch6 = null, ushort? ch7 = null, ushort? ch8 = null);

        /// <summary>
        /// 用指定的值设置通道和偏航。
        /// </summary>
        /// <param name="ch1">通道 1 的目标值。</param>
        /// <param name="ch2">通道 2 的目标值。</param>
        /// <param name="ch3">通道 3 的目标值。</param>
        /// <param name="ch4">通道 4 的目标值。目前此参数无效（20160119）。</param>
        /// <param name="ch5">通道 5 的目标值。</param>
        /// <param name="ch6">通道 6 的目标值。</param>
        /// <param name="ch7">通道 7 的目标值。</param>
        /// <param name="ch8">通道 8 的目标值。</param>
        /// <param name="yaw">偏航的目标值</param>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task SetMobileControlAsync(ushort? ch1 = null, ushort? ch2 = null, ushort? ch3 = null, ushort? ch4 = null, ushort? ch5 = null, ushort? ch6 = null, ushort? ch7 = null, ushort? ch8 = null, float? yaw = null);

        /// <summary>
        /// 进入紧急悬停状态。此状态需要使用 GPS 定位，卫星数不足导致定位不准时非常危险。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task StartEmergencyHoverAsync();

        /// <summary>
        /// 开始根据各个目标属性（如 <see cref="DesiredChannel1"/>）控制飞行器。
        /// </summary>
        /// <param name="millisecondsInterval">发送控制命令的时间间距，若为 null，将由 SDK 决定。</param>
        void StartMobileControl(int? millisecondsInterval = null);

        /// <summary>
        /// 停止紧急悬停。
        /// </summary>
        void StopEmergencyHover();

        /// <summary>
        /// 停止根据各个目标属性（如 <see cref="DesiredChannel1"/>）控制飞行器。
        /// </summary>
        void StopMobileControl();

        /// <summary>
        /// 自动起飞到预定高度。此操作需要使用 GPS 定位，卫星数不足导致定位不准时非常危险。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task TakeOffAsync();

        /// <summary>
        /// 自动解锁并起飞到指定高度。此操作需要使用 GPS 定位，卫星数不足导致定位不准时非常危险。
        /// </summary>
        /// <param name="alt">目标高度。</param>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task TakeOffAsync(float alt);

        /// <summary>
        /// 解锁飞行器。螺旋桨将开始转动，但飞行器不会起飞。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task UnlockAsync();
    }
}
