// Start is called before the first frame update
    void Start()
    {
        AttractState = EAttractState.NONE;
        //LineRenderAttract = GetComponent<LineRenderAttractRenderer>();

        LineRenderLaunchAim         = Platform.GetComponent <LineRenderer>();
        LineRenderLaunchAim.enabled = false;
    }
    // Update is called once per frame
    void Update()
    {
        transform.SetPositionAndRotation(RightHandAnchor.transform.position, RightHandAnchor.transform.rotation);

        //Trigger button
        if (OVRInput.GetDown(OVRInput.Button.SecondaryIndexTrigger))
        {
            IsCharging = true;
            LineRenderLaunchAim.enabled = true;
        }

        if (OVRInput.GetUp(OVRInput.Button.SecondaryIndexTrigger))
        {
            Debug.Log("OnTriggerRelease | ChargeLevel: " + ChargeLevel);

            ChargeAtRelease = ChargeLevel;
            ChargeLevel     = 0;



            IsCharging         = false;
            JustReleasedCharge = true;

            LauncherBase.transform.localPosition = BaseOrigin;


            ReleaseStopTime = Time.time + ReleaseDuration;
            Platform.transform.localPosition = outer;

            AttractState = EAttractState.NONE;
            LockedBall   = null;

            LineRenderLaunchAim.enabled = false;
        }

        //------------------Attract

        //Grip button
        if (OVRInput.GetDown(OVRInput.Button.SecondaryHandTrigger))
        {
            AttractState = EAttractState.LOCKING;
        }


        if (OVRInput.GetUp(OVRInput.Button.SecondaryHandTrigger))
        {
            AttractState = EAttractState.NONE;
        }

        //Look for lock hit
        if (AttractState == EAttractState.LOCKING)
        {
            //Draw LineRenderAttractRenderAttract to aim
            LineRenderAttract.enabled = true;
            LineRenderAttract.SetPosition(0, transform.position);
            LineRenderAttract.SetPosition(1, transform.position + transform.forward * 700);

            //If locked on ball
            if (Physics.Raycast(transform.position, transform.forward, out HitBall, Mathf.Infinity, 1 << 11))
            {
                //Ball
                LockedBall = HitBall.transform.GetComponentInParent <Ball>();
                LockedBall.SetState(Ball.EBallState.ATTRACTTOPLAYER);

                //Launcher
                AttractState = EAttractState.ATTRACTING;
                LineRenderAttract.enabled = false;
            }
        }

        else if (AttractState == EAttractState.ATTRACTING && LockedBall)
        {
            //Draw visualization
            LineRenderAttract.SetPosition(0, LockedBall.transform.position);
            LineRenderAttract.SetPosition(1, AimPoint);
            LineRenderAttract.enabled = true;



            DistanceToBall = (LockedBall.transform.position - transform.position).magnitude;
            Distance_ThreeQuarterToBall = DistanceToBall / 1.5f;
            AimPoint       = transform.position + transform.forward * Distance_ThreeQuarterToBall;
            BallToAimPoint = AimPoint - LockedBall.transform.position;

            LauncherFront = transform.position + transform.forward * 5;

            BallToLauncerFront = LauncherFront - LockedBall.transform.position;

            DistanceToBall = (LauncherFront - LockedBall.transform.position).magnitude;


            //if (LockedBall.GetState() != Ball.EBallState.HELDBYCATCHER)
            //{

            //LockedBall.AttractToPlayer((transform.position - LockedBall.transform.position).normalized * 10);
            //

            if (DistanceToBall > 20)
            {
                LockedBall.AttractToPlayer((BallToAimPoint + BallToLauncerFront).normalized * 10);
            }

            else
            {
                LockedBall.SetDrag(5 / DistanceToBall);
                LockedBall.AttractToPlayer(BallToAimPoint.normalized * 10);
            }
            //}
        }

        else if (AttractState == EAttractState.NONE)
        {
            if (LockedBall)
            {
                if (LockedBall.GetState() != Ball.EBallState.HELDBYCATCHER)
                {
                    LockedBall.SetState(Ball.EBallState.FREE);
                }


                LockedBall = null;
            }

            LineRenderAttract.enabled = false;
        }



        //------------------/Attract


        //------------------Launch

        if (IsCharging)
        {
            if (ChargeLevel < 0.99)
            {
                ChargeLevel += 0.01f;
            }


            //Set charge shake whenever its charging
            ShakeOffsett = (Mathf.Sin(Time.time * 1000) * ChargeLevel) / 70;
            LauncherBase.transform.localPosition = new Vector3(ShakeOffsett,
                                                               -ShakeOffsett,
                                                               0.0f);
            Platform.transform.localPosition = Vector3.Lerp(outer, inner, ChargeLevel);

            LineRenderLaunchAim.SetPosition(0, transform.position);
            LineRenderLaunchAim.SetPosition(1, transform.position + (transform.forward * 5 * ChargeLevel));
        }

        else
        {
            //Handle release time
            if (JustReleasedCharge && Time.time > ReleaseStopTime)
            {
                ChargeAtRelease    = 0;
                JustReleasedCharge = false;
            }
        }

        ChargeIndicator.text = ((ChargeLevel * 100) + 0.01f).ToString("F0") + "%";
    }