using System.Threading;
using System.Threading.Tasks;

namespace Plane.Copters
{
    /// <summary>
    /// 定义用于操纵飞行器的属性和方法。
    /// </summary>
    public partial interface ICopterActions : ICopterActionsSharedByCopterManager, ICopterMissionActions
    {
        /// <summary>
        /// 获取或设置目标通道 1。
        /// </summary>
        ushort? DesiredChannel1 { get; set; }

        /// <summary>
        /// 获取或设置目标通道 2。
        /// </summary>
        ushort? DesiredChannel2 { get; set; }

        /// <summary>
        /// 获取或设置目标通道 3。
        /// </summary>
        ushort? DesiredChannel3 { get; set; }

        /// <summary>
        /// 获取或设置目标通道 4。
        /// </summary>
        ushort? DesiredChannel4 { get; set; }

        /// <summary>
        /// 获取或设置目标通道 5。
        /// </summary>
        ushort? DesiredChannel5 { get; set; }

        /// <summary>
        /// 获取或设置目标通道 6。
        /// </summary>
        ushort? DesiredChannel6 { get; set; }

        /// <summary>
        /// 获取或设置目标通道 7。
        /// </summary>
        ushort? DesiredChannel7 { get; set; }

        /// <summary>
        /// 获取或设置目标通道 8。
        /// </summary>
        ushort? DesiredChannel8 { get; set; }

        /// <summary>
        /// 获取或设置目标偏航。
        /// </summary>
        float? DesiredYaw { get; set; }

        /// <summary>
        /// 获取一个值，指示飞行器是否正处于紧急悬停状态。
        /// </summary>
        bool IsEmergencyHoverActive { get; }

        /// <summary>
        /// 开启与飞行器之间的连接。
        /// </summary>
        /// <returns>表示此异步操作的 <see cref="Task"/> 实例。</returns>
        Task ConnectAsync();

        /// <summary>
        /// 跟随。
        /// </summary>
        /// <param name="target">目标。</param>
        /// <param name="keepYawDifference">设为 true 进保持偏航角度差，设为 false 时将保持两者在空间中的相对位置。</param>
        /// <param name="keepFacingTarget">是否保持机头面对目标。</param>
        void Follow(IVisibleStatus target, bool keepYawDifference = false, bool keepFacingTarget = true, bool keep3DRelativeLocations = false);

        /// <summary>
        /// 向飞行器请求数据。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task GetCopterDataAsync();

        /// <summary>
        /// 获取参数的值。
        /// </summary>
        /// <param name="paramName">参数名。</param>
        /// <param name="millisecondsTimeout">超时时间，单位为毫秒。</param>
        /// <returns>表示参数获取异步操作的 <see cref="Task{TResult}"/>，其结果即为参数的值。</returns>
        /// <exception cref="System.TimeoutException">操作超时。</exception>
        Task<float> GetParamAsync(string paramName, int millisecondsTimeout = Timeout.Infinite);

        /// <summary>
        /// 把所有通道设置为目标值。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task SetChannelsAsync();

        /// <summary>
        /// 用各个目标值属性设置通道和偏航。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task SetMobileControlAsync();

        /// <summary>
        /// 设置参数，返回的 <see cref="Task"/> 实例在确认设置成功后完成。
        /// </summary>
        /// <param name="paramName">参数名。</param>
        /// <param name="value">值。</param>
        /// <param name="millisecondsTimeout">超时时间，单位为毫秒。</param>
        /// <returns>表示异步设置参数操作的 <see cref="Task"/> 实例。</returns>
        /// <exception cref="System.TimeoutException">操作超时。</exception>
        Task SetParamAsync(string paramName, float value, int millisecondsTimeout = Timeout.Infinite);
        bool GetShowLEDAsync();

        Task SetShowLEDAsync(bool Ledon);
        Task SetShowLEDFlashAsync(int Flashtype, int millisecondsTime);
        


        /// <summary>
        /// 开始对频。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task StartPairingAsync();

        /// <summary>
        /// 停止对频。
        /// </summary>
        /// <returns>表示此命令异步发送操作的 <see cref="Task"/> 实例。</returns>
        Task StopPairingAsync();
    }
}
