using System;
using System.Collections.Generic;
using System.Text;
using Yanesdk.Input;

namespace Yamalib.Input
{
    class MultiMouse : IMouseInput
    {
        ///	マウスカーソルを表示する
        public void Show()
        {
            m_primaryMouse.Show();
            foreach (IMouseInput mouse in m_optionalMouse)
            {
                mouse.Show();
            }
        }

        ///	マウスカーソルを非表示にする
        public void Hide()
        {
            m_primaryMouse.Hide();
            foreach (IMouseInput mouse in m_optionalMouse)
            {
                mouse.Hide();
            }
        }

        ///	マウスの位置取得
        /**
            マウスが画面外にあるときは最後に取得した値が返ります。
            すなわち、画面サイズが640×480ならば、xは0〜639,yは0〜479までの
            値しか返らないことが保証されます。
        */
        public void GetPos(out int x, out int y)
        {
            m_primaryMouse.GetPos(out x, out y);
        }

        ///	マウスの位置を設定
        /**
            SDLのマウスの位置設定イベントが発生する。
        */
        public void SetPos(int x, int y)
        {
            m_primaryMouse.SetPos(x, y);
        }

        ///	ボタンが押し下げられているかを判定する関数
        public bool IsPress(MouseInput.Button e)
        {
            if (m_primaryMouse.IsPress(e))
            {
                return true;
            }
            else
            {
                foreach (IMouseInput mouse in m_optionalMouse)
                {
                    if (mouse.IsPress(e))
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        public bool IsPush(MouseInput.Button e)
        {
            if (m_primaryMouse.IsPush(e))
            {
                return true;
            }
            else
            {
                foreach (IMouseInput mouse in m_optionalMouse)
                {
                    if (mouse.IsPush(e))
                    {
                        return true;
                    }
                }
            }
            return false;
        }

        public bool IsWheelUp
        {
            get
            {
                if (m_primaryMouse.IsWheelUp)
                {
                    return true;
                }
                else
                {
                    foreach (IMouseInput mouse in m_optionalMouse)
                    {
                        if (mouse.IsWheelUp)
                        {
                            return true;
                        }
                    }
                }
                return false;
            }
        }

        public bool IsWheelDown
        {
            get
            {
                if (m_primaryMouse.IsWheelDown)
                {
                    return true;
                }
                else
                {
                    foreach (IMouseInput mouse in m_optionalMouse)
                    {
                        if (mouse.IsWheelDown)
                        {
                            return true;
                        }
                    }
                }
                return false;
            }
        }


        /// <summary>
        /// 論理位置の設定
        /// </summary>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        public void SetLogicalPos(int x, int y)
        {
            m_primaryMouse.SetLogicalPos(x, y);
            foreach (IMouseInput mouse in m_optionalMouse)
            {
                mouse.SetLogicalPos(x, y);
            }
        }

        /// <summary>
        /// 状態のリセット
        /// </summary>
        public void Reset()
        {
            m_primaryMouse.Reset();
            foreach (IMouseInput mouse in m_optionalMouse)
            {
                mouse.Reset();
            }
        }

        /// <summary>
        /// 内部状態を更新する
        /// この関数が呼ばれた瞬間の情報を保持し、
        /// 次のupdateが呼ばれるまでマウスの状態は同じ状態を返す
        /// </summary>
        public void Update()
        {
            //m_primaryMouse.Update();
            foreach (IMouseInput mouse in m_optionalMouse)
            {
                mouse.Update();
            }
        }

        /// <summary>
        /// プライマリマウスのみdisposeする！
        /// </summary>
        public void Dispose()
        {
            m_primaryMouse.Dispose();
        }

        /// マウスを追加する
        public void AddMouse(IMouseInput mouse)
        {
            m_optionalMouse.Add(mouse);
        }

        /// コンストラクタ
        public MultiMouse(IMouseInput primary)
        {
            m_primaryMouse = primary;
        }

        private IMouseInput m_primaryMouse;
        private List<IMouseInput> m_optionalMouse = new List<IMouseInput>();

        #region IMouseInput メンバ

        #endregion

        #region IMouseInput メンバ


        #endregion
    }
}
