using Rigging.Data;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

namespace Rigging.Animations
{

    // �������ƵĶ���
    public class AnimationObject : MonoBehaviour
    {

        public AnimationParam<PhysicsAnimation> animations;

        private Rigidbody rig;

        private StepHandler stepHandler;

        private Transform hip;

        public float smoothing;

        public float multiplier = 1f;

        private bool isCurrentlyLeft;

        public bool isLeft;

        public UnityEvent switchToForwardEvent;

        public UnityEvent switchToBackwardsEvent;

        public bool dontAnimateIfHoldingSomething;

        private float muscleMultiplier = 1f;

        private void Start()
        {
            rig = GetComponent<Rigidbody>();
            stepHandler = base.transform.root.GetComponentInChildren<StepHandler>();
            Rigging.BodyPart.Hip componentInChildren = base.transform.root.GetComponentInChildren<Rigging.BodyPart.Hip>();
            if ((bool)componentInChildren)
            {
                hip = componentInChildren.transform;
            }

            animations.SetPlayer(transform.root.GetComponent<Player>());
        }

        private void FixedUpdate()
        {
            SetMultiplier();
            AddTorque();
            AddForce();
        }

        private void AddForce()
        {
            Vector3 vector = Vector3.zero;
            if (isCurrentlyLeft == isLeft)
            {
                Vector3 forwardForce = animations.current.forwardForce;
                if (animations.current.forceSpace == PhysicsAnimation.ForceSpace.World)
                {
                    vector = forwardForce;
                }
                if (animations.current.forceSpace == PhysicsAnimation.ForceSpace.Hip)
                {
                    vector = hip.TransformDirection(forwardForce);
                }
            }
            else
            {
                Vector3 backwardsForce = animations.current.backwardsForce;
                if (animations.current.forceSpace == PhysicsAnimation.ForceSpace.World)
                {
                    vector = backwardsForce;
                }
                if (animations.current.forceSpace == PhysicsAnimation.ForceSpace.Hip)
                {
                    vector = hip.TransformDirection(backwardsForce);
                }
            }
            rig.AddForce(vector * muscleMultiplier * multiplier, ForceMode.Acceleration);
        }

        private void AddTorque()
        {
            Vector3 vector = ((isCurrentlyLeft != isLeft) ? hip.TransformDirection(animations.current.backwardsTorque) : hip.TransformDirection(animations.current.forwardTorque));
            Vector3 toque = vector * muscleMultiplier * multiplier;
            //Debug.DrawLine(rig.transform.position, rig.transform.position + toque.normalized * 0.3f);
            rig.AddTorque(toque, ForceMode.Acceleration);
        }

        private void SetMultiplier()
        {
            if (smoothing != 0f)
            {
                float b = 1f;
                if (isCurrentlyLeft != stepHandler.isLeft)
                {
                    b = 0f;
                }
                multiplier = Mathf.Lerp(multiplier, b, 1f / smoothing);
                if (multiplier < 0.1f)
                {
                    ChangeStep();
                }
            }
            else
            {
                ChangeStep();
            }
        }

        private void ChangeStep()
        {
            if (isCurrentlyLeft != stepHandler.isLeft)
            {
                if (stepHandler.isLeft == isLeft)
                {
                    switchToForwardEvent.Invoke();
                }
                else
                {
                    switchToBackwardsEvent.Invoke();
                }
                isCurrentlyLeft = stepHandler.isLeft;
            }
        }
    }

}