using Thousandto.Core.Base;
using System;
using System.Collections.Generic;

using System.Text;
using UnityEngine;
using FLogger = UnityEngine.Gonbest.MagicCube.FLogger;

namespace Thousandto.Plugins.Common
{
    /// <summary>
    /// 手势操作事件触发器
    /// </summary>
    public class FingerGesturesEventTrigger : IFingerGesturesEvent
    {
        #region//私有变量
        FingerGesturesLoader _loader = null;
        private FingerDownEventHandler _onFingerDown;
        private FingerMoveEventHandler _onFingerMove;
        private FingerMoveEventHandler _onFingerMoveBegin;
        private FingerMoveEventHandler _onFingerMoveEnd;
        private FingerUpEventHandler _onFingerUp;
        private PinchEventHandler _onPinchBegin;
        private PinchEventHandler _onPinchEnd;
        private PinchMoveEventHandler _onPinchMove;
        private RotationBeginEventHandler _onRotationBegin;
        private RotationEndEventHandler _onRotationEnd;
        private RotationMoveEventHandler _onRotationMove;
        #endregion

        #region//事件定义接口 IFingerGesturesEvent
        public event FingerDownEventHandler OnFingerDown
        {
            add 
            {
                _onFingerDown = (FingerDownEventHandler)Delegate.Combine(_onFingerDown, value);
            }
            remove 
            {
                _onFingerDown = (FingerDownEventHandler)Delegate.Remove(_onFingerDown, value);
            }
        }

        public event FingerMoveEventHandler OnFingerMove
        {
            add
            {
                _onFingerMove = (FingerMoveEventHandler)Delegate.Combine(_onFingerMove, value);
            }
            remove
            {
                _onFingerMove = (FingerMoveEventHandler)Delegate.Remove(_onFingerMove, value);
            }
        }

        public event FingerMoveEventHandler OnFingerMoveBegin
        {
            add
            {
                _onFingerMoveBegin = (FingerMoveEventHandler)Delegate.Combine(_onFingerMoveBegin, value);
            }
            remove
            {
                _onFingerMoveBegin = (FingerMoveEventHandler)Delegate.Remove(_onFingerMoveBegin, value);
            }
        }

        public event FingerMoveEventHandler OnFingerMoveEnd
        {
            add
            {
                _onFingerMoveEnd = (FingerMoveEventHandler)Delegate.Combine(_onFingerMoveEnd, value);
            }
            remove
            {
                _onFingerMoveEnd = (FingerMoveEventHandler)Delegate.Remove(_onFingerMoveEnd, value);
            }
        }

        public event FingerUpEventHandler OnFingerUp
        {
            add
            {
                _onFingerUp = (FingerUpEventHandler)Delegate.Combine(_onFingerUp, value);
            }
            remove
            {
                _onFingerUp = (FingerUpEventHandler)Delegate.Remove(_onFingerUp, value);
            }
        }

        public event PinchEventHandler OnPinchBegin
        {
            add
            {
                _onPinchBegin = (PinchEventHandler)Delegate.Combine(_onPinchBegin, value);
            }
            remove
            {
                _onPinchBegin = (PinchEventHandler)Delegate.Remove(_onPinchBegin, value);
            }
        }

        public event PinchEventHandler OnPinchEnd
        {
            add
            {
                _onPinchEnd = (PinchEventHandler)Delegate.Combine(_onPinchEnd, value);
            }
            remove
            {
                _onPinchEnd = (PinchEventHandler)Delegate.Remove(_onPinchEnd, value);
            }
        }

        public event PinchMoveEventHandler OnPinchMove
        {
            add
            {
                _onPinchMove = (PinchMoveEventHandler)Delegate.Combine(_onPinchMove, value);
            }
            remove
            {
                _onPinchMove = (PinchMoveEventHandler)Delegate.Remove(_onPinchMove, value);
            }
        }

        public event RotationBeginEventHandler OnRotationBegin
        {
            add
            {
                _onRotationBegin = (RotationBeginEventHandler)Delegate.Combine(_onRotationBegin, value);
            }
            remove
            {
                _onRotationBegin = (RotationBeginEventHandler)Delegate.Remove(_onRotationBegin, value);
            }
        }

        public event RotationEndEventHandler OnRotationEnd
        {
            add
            {
                _onRotationEnd = (RotationEndEventHandler)Delegate.Combine(_onRotationEnd, value);
            }
            remove
            {
                _onRotationEnd = (RotationEndEventHandler)Delegate.Remove(_onRotationEnd, value);
            }
        }

        public event RotationMoveEventHandler OnRotationMove
        {
            add
            {
                _onRotationMove = (RotationMoveEventHandler)Delegate.Combine(_onRotationMove, value);
            }
            remove
            {
                _onRotationMove = (RotationMoveEventHandler)Delegate.Remove(_onRotationMove, value);
            }
        }
        #endregion

        #region//公共接口
        //初始化
        public void Initialize()
        {            
            if (_loader == null) _loader = new FingerGesturesLoader();

            FingerGestures.OnFingerDown = FingerGestures_OnFingerDown;
            FingerGestures.OnFingerUp = FingerGestures_OnFingerUP;

            // --  控制摄像机的先注释掉
            // pinch touch func -- camera dis                
            FingerGestures.OnPinchBegin = FingerGestures_OnPinchBegin;
            FingerGestures.OnPinchMove = FingerGestures_OnPinchMove;
            FingerGestures.OnPinchEnd = FingerGestures_OnPinchEnd;

            // rotate touch -- camera yaw                
            FingerGestures.OnRotationBegin = FingerGestures_OnRotationBegin;
            FingerGestures.OnRotationMove = FingerGestures_OnRotationMove;
            FingerGestures.OnRotationEnd = FingerGestures_OnRotationEnd;
            

            FingerGestures.OnFingerMoveBegin = FingerGestures_OnMoveBegin;
            FingerGestures.OnFingerMove = FingerGestures_OnMove;
            FingerGestures.OnFingerMoveEnd = FingerGestures_OnMoveEnd;            
        }
        //卸载
        public void UnInitialize()
        {
            FLogger.Log("FingerGesturesEventTrigger::UnInitialize()");           
            // tap func -- move
            FingerGestures.OnFingerDown = null;
            FingerGestures.OnFingerUp = null;

            // pinch touch func -- camera dis
            FingerGestures.OnPinchBegin = null;
            FingerGestures.OnPinchMove = null;
            FingerGestures.OnPinchEnd = null;

            // rotate touch -- camera yaw
            FingerGestures.OnRotationBegin = null;
            FingerGestures.OnRotationMove = null;
            FingerGestures.OnRotationEnd = null;

            FingerGestures.OnFingerMoveBegin = null;
            FingerGestures.OnFingerMove = null;
            FingerGestures.OnFingerMoveEnd = null;            
        }
        #endregion

        #region //事件的处理
        //手指按下开始移动
        private void FingerGestures_OnMoveBegin(int fingerIndex, Vector2 fingerPos)
        {
            //FLogger.Log("FingerGestures_OnMoveBegin)", fingerIndex, fingerPos);
            if (_onFingerMoveBegin != null) _onFingerMoveBegin(fingerIndex, fingerPos);
        }
        //手指按下移动中
        private void FingerGestures_OnMove(int fingerIndex, Vector2 fingerPos)
        {

            if (_onFingerMove != null) _onFingerMove(fingerIndex, fingerPos);
        }

        ////手指按下移动结束
        private void FingerGestures_OnMoveEnd(int fingerIndex, Vector2 fingerPos)
        {
            //FLogger.Log("FingerGestures_OnMoveEnd)", fingerIndex, fingerPos);
            if (_onFingerMoveEnd != null) _onFingerMoveEnd(fingerIndex, fingerPos);
        }

        //按下操作处理
        private void FingerGestures_OnFingerDown(int fingerindex, Vector2 fingerpos)
        {
            if (_onFingerDown != null) _onFingerDown(fingerindex, fingerpos);
        }

        //抬起的操作处理
        private void FingerGestures_OnFingerUP(int fingerindex, Vector2 fingerpos, float time)
        {
            if (_onFingerUp != null) _onFingerUp(fingerindex, fingerpos, time);           
        }            


        //两个手指进行捏或者划操作 -- 开始
        private void FingerGestures_OnPinchBegin(Vector2 fingerPos1, Vector2 fingerPos2)
        {
            if (_onPinchBegin != null) _onPinchBegin(fingerPos1, fingerPos2);           
        }
        //两个手指进行捏或者划操作 -- 移动
        private void FingerGestures_OnPinchMove(Vector2 fingerPos1, Vector2 fingerPos2, float delta)
        {
            if (_onPinchMove != null) _onPinchMove(fingerPos1, fingerPos2, delta);
        }
        //两个手指进行捏或者划操作 -- 结束
        private void FingerGestures_OnPinchEnd(Vector2 fingerPos1, Vector2 fingerPos2)
        {
            if (_onPinchEnd != null) _onPinchEnd(fingerPos1, fingerPos2);
        }
        //两个手指进行旋转操作 -- 开始
        private void FingerGestures_OnRotationBegin(Vector2 fingerPos1, Vector2 fingerPos2)
        {
            if (_onRotationBegin != null) _onRotationBegin(fingerPos1, fingerPos2);
        }
        //两个手指进行旋转操作 -- 移动
        private void FingerGestures_OnRotationMove(Vector2 fingerPos1, Vector2 fingerPos2, float rotationAngleDelta)
        {
            if (_onRotationMove != null) _onRotationMove(fingerPos1, fingerPos2, rotationAngleDelta);           
        }
        //两个手指进行旋转操作 --结束
        private void FingerGestures_OnRotationEnd(Vector2 fingerPos1, Vector2 fingerPos2, float totalRotationAngle)
        {
            if (_onRotationEnd != null) _onRotationEnd(fingerPos1, fingerPos2, totalRotationAngle);
        }
        #endregion
    }
}