using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class CameraView : MonoBehaviour
{
    public enum RotationAxes
    {
        MouseXAndY = 0,
        MouseX = 1,
        MouseY = 2
    }
    public RotationAxes axes = RotationAxes.MouseXAndY;
    public float sensitivityHor = 1f;
    public float sensitivityVert = 1f;

    public float moveSpeed = 5f;

    public float minmumVert = -89f;
    public float maxmumVert = 89f;

    private float _rotationX = 0;
    private float _rotationY = 0;

    private Vector3 initPos;
    private Quaternion initRotation;

    //回到初始视角
    private bool isBack;
    //移动到下一个视角
    private bool isMove;
    //是否需要移动到下一个视角
    private bool isCanMove;


    private Vector3 nextPos;
    private Quaternion nextAngle;

    //相机是否在房间内
    private bool isNear;

    /// <summary>
    /// 点击UI回到初始视角
    /// </summary>
    public bool isUIInit;


    // Use this for initialization
    void Start()
    {
        //Cursor.lockState = CursorLockMode.Locked;//锁定指针到视图中心
        //Cursor.visible = false;//隐藏指针
        _rotationX = transform.localEulerAngles.x;
        initPos = transform.position;
        initRotation = transform.rotation;



    }
    /// <summary>
    /// 回到初始视角(无动画)
    /// </summary>
    public void InitView() {

        transform.position = initPos;
        transform.rotation = initRotation;
        _rotationX = transform.localEulerAngles.x;
    }

    /// <summary>
    /// 动画移动到初始视角
    /// </summary>
    public void InitViewAnim() {
        //停止上一次动画
        StopCamMove();
        isBack = true;
        isCanMove = false;
        isMove = false;
    }

    /// <summary>
    /// 移动相机:先回到初始视角,再移动到目标视角
    /// </summary>
    /// <param name="pos"></param>
    /// <param name="angle"></param>
    public void CamerMoveAnimAfter(Vector3 pos, Quaternion angle) {
        //停止上一次动画
        StopCamMove();
        isBack = true;
        isCanMove = true;
        nextAngle = angle;
        nextPos = pos;
    }
    /// <summary>
    /// 移动相机:相机在房间内,先回到初始角度再移至目标位置,相机在房间外,直接移动到目标位置
    /// </summary>
    /// <param name="pos"></param>
    /// <param name="angle"></param>
    public void CamerMoveAnim(Vector3 pos, Quaternion angle)
    {
        if (isNear)
            CamerMoveAnimAfter(pos,angle);
        else
            CameraMoveTarget(pos, angle);


    }
    /// <summary>
    /// 移动相机:直接动画移动到目标位置
    /// </summary>
    /// <param name="pos"></param>
    /// <param name="angle"></param>
    public void CameraMoveTarget(Vector3 pos, Quaternion angle) {
        StopCamMove();
        isBack = false;
        isCanMove = false;
        nextAngle = angle;
        nextPos = pos;
        isMove = true;
    }

    /// <summary>
    /// 停止相机移动动画
    /// </summary>
    public void StopCamMove()
    {
        if (isBack || isMove)
        {
            _rotationX = RotationX(transform.localEulerAngles.x);
            _rotationY = transform.localEulerAngles.y;
        }
        isBack = false;
        isMove = false;
        isCanMove = false;
        isUIInit = false;
    }



    // Update is called once per frame
    void Update()
    {
        

        //动画移动相机回到初始视角
        if (isBack)
        {
            transform.position = Vector3.Lerp(transform.position, initPos, Time.deltaTime);
            transform.rotation = Quaternion.Lerp(transform.rotation, initRotation, Time.deltaTime);
            if (isBack && Vector3.Distance(transform.position, initPos) <=1f&& Vector3.Distance(transform.eulerAngles, initRotation.eulerAngles) <=1f)
            {
                if (isCanMove)
                {
                    isCanMove=false;
                    //开始移动到下一视角
                    isMove = true;
                    Debug.Log("移动到下一视角");
                }
                if (isUIInit)
                {
                    isUIInit=false;
                    Main.intance.m_htmlPanel.CallFunction("toggleMenuActive");
                }
                    
                isBack = false;
                //同步当前俯仰角度
                _rotationX = RotationX(transform.localEulerAngles.x);
                _rotationY = transform.localEulerAngles.y;
                
            }
            
        }
        //动画移动相机
        if (isMove)
        {
            transform.position = Vector3.Lerp(transform.position, nextPos, Time.deltaTime);
            transform.rotation = Quaternion.Lerp(transform.rotation, nextAngle, Time.deltaTime);
            if (isMove && Vector3.Distance(transform.position, nextPos) <= 1f && Vector3.Distance(transform.eulerAngles, nextAngle.eulerAngles) <= 1f)
            {
                isMove = false;
                Debug.Log("移动结束");
                //同步当前俯仰角度
                _rotationX = RotationX(transform.localEulerAngles.x);
                _rotationY = transform.localEulerAngles.y;
            }

        }

        
        if (Input.GetKeyDown(KeyCode.F))
        {
            //InitView();
            isBack = true;
            //CamerMoveAnim(Vector3.zero,Main.intance.transform.rotation);
        }

        if (Input.GetMouseButton(1))
        {
            //当自主操作时,停止动画移动
            StopCamMove();

            if (axes == RotationAxes.MouseX)
            {
                _rotationY+= Input.GetAxis("Mouse X") * sensitivityHor;
                transform.rotation = Quaternion.Euler(_rotationX, _rotationY,0);
                //transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityHor, 0);
                //transform.localEulerAngles = new Vector3(0, transform.localEulerAngles.y - Input.GetAxis("Mouse X") * sensitivityHor, 0);
            }
            else if (axes == RotationAxes.MouseY)
            {
                _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
                _rotationX = Mathf.Clamp(_rotationX, minmumVert, maxmumVert);
                //float rotationY = transform.localEulerAngles.y;
                transform.rotation = Quaternion.Euler(_rotationX, _rotationY, 0);
                //transform.localEulerAngles = new Vector3(_rotationX, _rotationY, 0);
            }
            else
            {
                _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
                _rotationX = Mathf.Clamp(_rotationX, minmumVert, maxmumVert);
                float delta = Input.GetAxis("Mouse X") * sensitivityHor;
                _rotationY +=delta;
                transform.rotation = Quaternion.Euler(_rotationX, _rotationY, 0);
                //transform.localEulerAngles = new Vector3(_rotationX, _rotationY, 0);
            }

            if (Input.GetKey(KeyCode.W))
            {
                transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
            }
            if (Input.GetKey(KeyCode.S))
            {
                transform.Translate(Vector3.back * Time.deltaTime * moveSpeed);
            }
            if (Input.GetKey(KeyCode.A))
            {
                transform.Translate(Vector3.left * Time.deltaTime * moveSpeed);
            }
            if (Input.GetKey(KeyCode.D))
            {
                transform.Translate(Vector3.right * Time.deltaTime * moveSpeed);
            }
            if (Input.GetKey(KeyCode.E))
            {
                transform.Translate(Vector3.up * Time.deltaTime * moveSpeed);
            }
            if (Input.GetKey(KeyCode.Q))
            {
                transform.Translate(Vector3.down * Time.deltaTime * moveSpeed);
            }
        }

        //判断相机是否进入房间内

        if (transform.position.y > 3)
        {
            isNear = false;
            //显示空间Icon
            ModelManager.instance.CameraNear(false);
        }
        else
        {
            isNear = true;
            //隐藏空间Icon
            ModelManager.instance.CameraNear(true);
        }
        

    }

    //private void OnTriggerEnter(Collider other)
    //{
    //    Debug.Log("相机进入");
    //    if (other.transform.tag == "RoomSpace")
    //    {
    //        //隐藏空间Icon
    //        ModelManager.instance.ShowSpaceIcon(false);
    //    }

    //}

    //private void OnTriggerExit(Collider other)
    //{

    //    Debug.Log("相机退出");
    //    if (other.transform.tag == "RoomSpace")
    //    {
    //        //显示空间Icon
    //        ModelManager.instance.ShowSpaceIcon(true);
    //    }
    //}

    private float RotationX(float x)
    {
        if (x > maxmumVert)
        {
            //当前值应该为负数
            return x - 360;
        } 
        return x;
        
    }

}