using System;
using System.Collections;
using System.Collections.Generic;
using Unity.XR.CoreUtils;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

[RequireComponent(
    typeof(ActionBasedContinuousMoveProvider), 
    typeof(ActionBasedContinuousTurnProvider),
    typeof(ActionBasedSnapTurnProvider))]
public class ThirdPersonTeleportController : MonoBehaviour
{

    public XROrigin xrOrigin;

    private ActionBasedContinuousMoveProvider _continuousMoveProvider;
    private ActionBasedContinuousTurnProvider _continuousTurnProvider;
    private ActionBasedSnapTurnProvider _snapTurnProvider;

    public GameObject cameraContainer;
    public bool switchToContinuous;

    private bool _lastControllerMoveStatus;

    private void Awake()
    {
        _continuousMoveProvider = GetComponent<ActionBasedContinuousMoveProvider>();
        _continuousTurnProvider = GetComponent<ActionBasedContinuousTurnProvider>();
        _snapTurnProvider = GetComponent<ActionBasedSnapTurnProvider>();
    }

    void Update()
    {
        
        if (StartedMoving())
        {
            Debug.Log("Started Moving");

            cameraContainer.transform.parent = null;
            cameraContainer.transform.position = xrOrigin.transform.position;
            //Switch to continuous turn while remote controlling.
            if (switchToContinuous)
            {
                _continuousTurnProvider.enabled = true;
                _snapTurnProvider.enabled = false;
            }
        }
        
        if (StoppedMoving())
        {
            Debug.Log("Stopped Moving");
            
            cameraContainer.transform.SetParent(xrOrigin.transform);
            var originTransform = xrOrigin.transform;
            cameraContainer.transform.position = originTransform.position;
            cameraContainer.transform.rotation = originTransform.rotation;

            if (switchToContinuous)
            {
                _continuousTurnProvider.enabled = false;
                _snapTurnProvider.enabled = true;
            }
        }
    }

    private bool StartedMoving()
    {
        var controllerStatus = GetControllerStatus();
        
        if (controllerStatus && _lastControllerMoveStatus == false)
        {
            _lastControllerMoveStatus = true;
            return true;
        }
        return false;
    }

    private bool StoppedMoving()
    {
        var controllerStatus = GetControllerStatus();
        if (_lastControllerMoveStatus && controllerStatus == false)
        {
            _lastControllerMoveStatus = false;
            return true;
        }

        _lastControllerMoveStatus = controllerStatus;
        return false;
    }

    private bool GetControllerStatus()
    {
        return _continuousMoveProvider.leftHandMoveAction.action.inProgress ||
               _continuousMoveProvider.rightHandMoveAction.action.inProgress;
    }
}