using Plane.CopterManagement;
using Plane.Geography;
using Plane.Messaging;

#if NETFX_CORE

using Key = Windows.System.VirtualKey;

#else

using System.Windows.Input;

#endif

namespace Plane.CopterControllers
{
    /// <summary>
    /// 利用键盘控制飞行器。
    /// </summary>
    public class KeyboardController : CopterControllerBase
    {
        private const ushort ADDED_VALUE = 400;
        private const ushort MED_VALUE = 1500;

        public KeyboardController(IPLMessenger messenger, ICopterManager copterManager) : base(messenger, copterManager)
        {
        }

        public override bool IsEnabled
        {
            get
            {
                return base.IsEnabled;
            }
            set
            {
                if (base.IsEnabled != value)
                {
                    base.IsEnabled = value;
                    if (value)
                    {
                        // TODO: 林俊清, 20160303, 修复 KeyboardController。
                        //_messenger.Register<KeyDownMessage>(this, OnKeyDown);
                        //_messenger.Register<KeyUpMessage>(this, OnKeyUp);
                    }
                    else
                    {
                        _messenger.Unregister(this);
                    }
                }
            }
        }

        public override CopterControllerTypes Type
        {
            get
            {
                return CopterControllerTypes.KeyboardController;
            }
        }

        //public async void OnKeyDown(KeyDownMessage m)
        //{
        //    if (IsEnabled)
        //    {
        //        switch (m.Key)
        //        {
        //            case Key.A:
        //                await _copterManager.SetMobileControlAsync(ch1: MED_VALUE - ADDED_VALUE);
        //                break;

        //            case Key.D:
        //                await _copterManager.SetMobileControlAsync(ch1: MED_VALUE + ADDED_VALUE);
        //                break;

        //            case Key.W:
        //                await _copterManager.SetMobileControlAsync(ch2: MED_VALUE - ADDED_VALUE);
        //                break;

        //            case Key.S:
        //                await _copterManager.SetMobileControlAsync(ch2: MED_VALUE + ADDED_VALUE);
        //                break;

        //            case Key.K:
        //                await _copterManager.SetMobileControlAsync(ch3: MED_VALUE - ADDED_VALUE);
        //                break;

        //            case Key.I:
        //                await _copterManager.SetMobileControlAsync(ch3: MED_VALUE + ADDED_VALUE);
        //                break;

        //            case Key.J:
        //                await _copterManager.SetMobileControlAsync(yaw: (_copterManager.Copter.Yaw - 10).NormalizeDirection());
        //                break;

        //            case Key.L:
        //                await _copterManager.SetMobileControlAsync(yaw: (_copterManager.Copter.Yaw + 10).NormalizeDirection());
        //                break;
        //        }
        //    }
        //}

        //public async void OnKeyUp(KeyUpMessage m)
        //{
        //    if (IsEnabled)
        //    {
        //        switch (m.Key)
        //        {
        //            case Key.A:
        //            case Key.D:
        //                await _copterManager.SetMobileControlAsync(ch1: MED_VALUE);
        //                break;

        //            case Key.W:
        //            case Key.S:
        //                await _copterManager.SetMobileControlAsync(ch2: MED_VALUE);
        //                break;

        //            case Key.K:
        //            case Key.I:
        //                await _copterManager.SetMobileControlAsync(ch3: MED_VALUE);
        //                break;

        //            case Key.J:
        //            case Key.L:
        //                await _copterManager.SetMobileControlAsync(yaw: (_copterManager.Copter.Yaw).NormalizeDirection());
        //                break;
        //        }
        //    }
        //}
    }
}
