using BeinLab.Util;
using DG.Tweening;
using SC.XR.Unity.Module_InputSystem;
using ShadowStudio.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using XRTool.Util;
namespace ShadowStudio.Tool
{
/////
///// 编辑状态
/////
//public enum TransferState
//{
// Start = 0,
// Doing = 1,
// Stop = 2
//}
//[RequireComponent(typeof(XBoundingBox))]
//[RequireComponent(typeof(XDragComponent))]
public class TransferComponent : MonoBehaviour/*, IPointerDownHandler*/
{
//[SerializeField]
/////
///// 是否垂直水平面
/////
//private bool isLookHead;
/////
///// 拖拽事件
/////
//public event Action DragTransfer;
/////
///// 缩放事件
/////
//public event Action ZoomTransfer;
/////
///// 旋转事件
/////
//public event Action RoteTransfer;
/////
///// 编辑事件
///// 当物体进行拖拽,缩放,旋转时都会触发
/////
//public event Action EditTransfer;
/////
///// 选中和非选中的事件
/////
//public event Action TransferSelect;
//public static TransferComponent curActiveCell;
//private XDragComponent dragCell;
//private XBoundingBox boundBox;
//private Coroutine editCoroutine;
//private bool isLock;
/////
///// 编辑模式
///// -1代表未编辑
///// 0代表拖拽
///// 1代表旋转
///// 2代表缩放
///// 开始前/结束后要设置为-1
///// 开始后到执行中设置对应的状态
/////
//private int editType = -1;
//private Timer dragTimer;
//public float autoDisDrag = 5f;
//private Stack postureHistroy;
//private Stack postureFuture;
//private GameObject boundCell;
//[SerializeField]
//private bool isDragEnable;
/////
///// 后退的栈
/////
//public Stack PostureBack
//{
// get
// {
// if (postureHistroy == null)
// {
// postureHistroy = new Stack();
// }
// return postureHistroy;
// }
//}
/////
///// 前进的栈
/////
//public Stack PostureAhead
//{
// get
// {
// if (postureFuture == null)
// {
// postureFuture = new Stack();
// }
// return postureFuture;
// }
//}
/////
///// 锁定
/////
//public bool IsLock
//{
// get
// {
// return isLock;
// }
// set
// {
// isLock = value;
// if (isLock)
// {
// PostureAhead.Clear();
// PostureBack.Clear();
// IsDragEnable = false;
// SetBoundActive(true);
// SetBoundColor(value, Color.yellow);
// }
// else
// {
// SetBoundColor(value, Color.white);
// if (curActiveCell != this)
// {
// SetBoundActive(false);
// }
// }
// }
//}
/////
///// 拖拽组件
/////
//public XDragComponent DragCell
//{
// get
// {
// if (!dragCell)
// {
// dragCell = GetComponent();
// dragCell.PointerDrag.AddListener(OnPointerDrag);
// //dragCell.PointerDown.AddListener(OnPointerDown);
// dragCell.PointerUp.AddListener(OnPointerUp);
// }
// return dragCell;
// }
//}
/////
///// 包围盒显示对象
/////
//public GameObject BoundCell
//{
// get
// {
// if (!boundCell)
// {
// boundCell = UnityUtil.GetBreadthChild(transform, "XRTool.Util.XBoundingBox");
// }
// return boundCell;
// }
//}
/////
///// 包围盒算法组件
/////
//public XBoundingBox BoundBox
//{
// get
// {
// if (!boundBox)
// {
// boundBox = GetComponent();
// if (!boundBox)
// {
// UnityLog.Instance.LogError(gameObject.name + "this is no XBoundingBox");
// }
// else
// {
// DragTransfer += state => { EditTransfer?.Invoke(state); };
// ZoomTransfer += state => { EditTransfer?.Invoke(state); };
// RoteTransfer += state => { EditTransfer?.Invoke(state); };
// EditTransfer += OnEditTransfer;
// boundBox.ScaleStarted.AddListener(OnScaleStarted);
// boundBox.ScaleStopped.AddListener(OnScaleStopped);
// boundBox.RotateStarted.AddListener(OnRotateStarted);
// boundBox.RotateStopped.AddListener(OnRotateStopped);
// }
// }
// return boundBox;
// }
//}
//public void SetBoundActive(bool isShow)
//{
// if (BoundCell)
// {
// BoundCell.SetActive(isShow);
// }
//}
/////
///// 初始化
/////
//private void Start()
//{
// if (BoundBox)
// {
// TimerMgr.Instance.CreateTimer(() =>
// {
// IsDragEnable = false;
// }, 0);
// }
//}
/////
///// 当编辑物体的时候
/////
/////
//private void OnEditTransfer(TransferState state)
//{
// if (state == TransferState.Start)
// {
// ClearTime();
// AddBackNode(UnityUtil.GetPosture(transform));
// }
// if (state == TransferState.Stop)
// {
// ClearTime();
// if (autoDisDrag > 0)
// {
// dragTimer = TimerMgr.Instance.CreateTimer(() => { IsDragEnable = false; }, autoDisDrag);
// }
// }
// print(editType + "__" + state);
//}
/////
///// 清除协程
/////
//private void ClearEditor()
//{
// if (editCoroutine != null)
// {
// StopCoroutine(editCoroutine);
// editCoroutine = null;
// }
//}
/////
///// 旋转结束
/////
//private void OnRotateStopped()
//{
// ClearEditor();
// RoteTransfer?.Invoke(TransferState.Stop);
// editType = -1;
//}
/////
///// 旋转开始
/////
//private void OnRotateStarted()
//{
// ClearEditor();
// RoteTransfer?.Invoke(TransferState.Start);
// editCoroutine = StartCoroutine(EditorCoroutine(1));
//}
/////
///// 缩放结束
/////
//private void OnScaleStopped()
//{
// ClearEditor();
// ZoomTransfer?.Invoke(TransferState.Stop);
// editType = -1;
// TimerMgr.Instance.CreateTimer(RemoveBound, 0.01f);
//}
/////
///// 缩放开始
/////
//private void OnScaleStarted()
//{
// ClearEditor();
// ZoomTransfer?.Invoke(TransferState.Start);
// editCoroutine = StartCoroutine(EditorCoroutine(2));
//}
/////
///// 编辑的协程
/////
/////
//private IEnumerator EditorCoroutine(int state)
//{
// editType = state;
// while (editType != -1)
// {
// if (editType == 1)
// {
// RoteTransfer?.Invoke(TransferState.Doing);
// }
// else if (editType == 2)
// {
// ZoomTransfer?.Invoke(TransferState.Doing);
// }
// yield return new WaitForFixedUpdate();
// }
//}
/////
///// 当按下的时候
///// 如果物体没有被锁定,处于可操作的状态时,显示操作框
/////
/////
//public void OnPointerDown(PointerEventData eventData)
//{
// if (IsLock || (SCInputModule.Instance && !SCInputModule.Instance.CanDrag))
// {
// return;
// }
// transform.DOKill();
// editType = -1;
// IsDragEnable = true;
// if (BoundBox)
// {
// BoundBox.OnPointerDown(eventData);
// }
// if (DragCell)
// {
// DragCell.OnPointerDown(eventData);
// }
//}
/////
///// 当抬起的时候
/////
/////
//public void OnPointerUp(PointerEventData eventData)
//{
// if (SCInputModule.Instance && !SCInputModule.Instance.CanDrag)
// {
// return;
// }
// if (editType != -1)
// {
// DragTransfer?.Invoke(TransferState.Stop);
// editType = -1;
// }
//}
/////
///// 拖拽事件
/////
/////
//private void OnPointerDrag(PointerEventData eventData)
//{
// if (editType == -1)
// {
// DragTransfer?.Invoke(TransferState.Start);
// //EditorTransfer?.Invoke(state, false);
// }
// if (isLookHead)
// {
// editType = 1;
// }
// else
// {
// editType = 0;
// }
// if (isLookHead && GameSession.Instance && GameSession.Instance.gameHead)
// {
// Vector3 pos = GameSession.Instance.gameHead.position;
// pos.y = transform.position.y;
// Vector3 forward = (transform.position - pos).normalized;
// pos.y = 0;
// if (forward != Vector3.zero)
// {
// transform.forward = forward;
// }
// }
// DragTransfer?.Invoke(TransferState.Doing);
//}
/////
///// 添加一个后退的节点
///// 当退出一个前进的节点或者编辑物体的时候添加
/////
/////
//public void AddBackNode(Posture posture)
//{
// if (PostureBack != null)
// {
// PostureBack.Push(posture);
// }
//}
/////
///// 退出一个后退的节点
/////
//public bool PeekBackNode()
//{
// if (PostureBack != null && PostureBack.Count > 0)
// {
// AddAheadNode(UnityUtil.GetPosture(transform));
// Posture posture = PostureBack.Pop();
// DelaySyn(posture, 0.2f);
// return true;
// }
// return false;
//}
/////
///// 延时控制
/////
/////
/////
//public void DelaySyn(Posture posture, float time)
//{
// ClearTime();
// editType = -1;
// EditTransfer?.Invoke(TransferState.Start);
// editType = 2;
// UnityUtil.SetPosture(transform, posture, time);
// ///同步3次位置,保持位移的实时性
// TimerMgr.Instance.CreateTimer(() =>
// {
// EditTransfer?.Invoke(TransferState.Doing);
// }, time / 4f, 3);
// TimerMgr.Instance.CreateTimer(() =>
// {
// EditTransfer?.Invoke(TransferState.Stop);
// editType = -1;
// }, time + 0.01f);
//}
/////
///// 添加一个前进的节点,仅当回退的时候添加
/////
/////
//public void AddAheadNode(Posture posture)
//{
// if (PostureAhead != null)
// {
// PostureAhead.Push(posture);
// }
//}
/////
///// 退出一个前进的节点
/////
//public bool PeekAheadNode()
//{
// if (PostureAhead != null && PostureAhead.Count > 0)
// {
// AddBackNode(UnityUtil.GetPosture(transform));
// Posture posture = PostureAhead.Pop();
// DelaySyn(posture, 0.2f);
// return true;
// }
// return false;
//}
/////
///// 清理此计时器
/////
//private void ClearTime()
//{
// if (dragTimer != null && TimerMgr.Instance)
// {
// TimerMgr.Instance.DestroyTimer(dragTimer);
// }
// dragTimer = null;
//}
/////
///// 重构包围盒
/////
/////
//public void RemoveBound()
//{
// if (BoundCell)
// {
// Destroy(BoundCell);
// }
// BoundBox.Start();
//}
/////
///// 设置编辑框的颜色
///// 用来判定颜色无法被选中的效果
/////
/////
//public void SetBoundColor(bool isLock, Color color)
//{
// if (BoundBox)
// {
// BoundBox.SetZoomColor(isLock, color);
// }
//}
/////
///// 获得距离最近的低啊
/////
/////
/////
//public Vector3 GetCastPoint(Vector3 point)
//{
// if (BoundBox)
// {
// return BoundBox.GetCastPoint(point);
// }
// return transform.position;
//}
/////
///// 设置位移编辑激活和失活
/////
/////
//public void SetTransferActive(bool isActive)
//{
// if (BoundBox && BoundBox.isActiveAndEnabled != isActive)
// {
// BoundBox.enabled = isActive;
// }
// if (DragCell && DragCell.isActiveAndEnabled != isActive)
// {
// DragCell.enabled = isActive;
// }
// SetBoundActive(isActive);
// if (!isActive)
// {
// DisActiveCell();
// }
//}
/////
///// 设置可操作性
/////
//public bool IsDragEnable
//{
// get => isDragEnable;
// set
// {
// isDragEnable = value;
// SetTransferActive(isDragEnable);
// if (isDragEnable && !IsLock)
// {
// ChangeActive();
// }
// }
//}
//public void ChangeActive()
//{
// if (curActiveCell && curActiveCell != this)
// {
// if (!curActiveCell.IsLock)
// {
// curActiveCell.IsDragEnable = false;
// }
// }
// if (!IsLock)
// {
// if (curActiveCell != this)
// {
// curActiveCell = this;
// TransferSelect?.Invoke(this, true);
// }
// if (curActiveCell)
// {
// curActiveCell.SetBoundActive(true);
// }
// }
//}
//public void DisActiveCell()
//{
// if (curActiveCell == this)
// {
// TransferSelect?.Invoke(this, false);
// curActiveCell = null;
// }
//}
}
}