// Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            SetCursorState(CursorLockMode.None);
        }

        if (Input.GetButtonDown("Crafting"))
        {
            SetCraftingMode(playerCrafter);
        }

        switch (currentInteractionState)
        {
        case interactionState.Normal:

            if (Input.GetAxisRaw("Aim") == 1)
            {
                currentInteractionState = interactionState.Aiming;
            }

            if (Input.GetButtonDown("Inventory"))
            {
                SetInventoryMode(true);
            }


            if (FreeLook)
            {
                /*
                 *
                 * //  only check on the X-Z plane:
                 * Vector3 cameraDirection = new Vector3(playerCamera.transform.forward.x, 0f, playerCamera.transform.forward.z);
                 * Vector3 playerDirection = new Vector3(transform.forward.x, 0f, transform.forward.z);
                 * if (Input.GetAxis("Vertical") != 0 || Input.GetAxis("Horizontal") != 0)
                 * {
                 *  if (Vector3.Angle(cameraDirection, playerDirection) > 15f)
                 *  {
                 *      Quaternion targetRotation = Quaternion.LookRotation(cameraDirection, transform.up);
                 *
                 *      transform.rotation = Quaternion.RotateTowards(transform.rotation,targetRotation, turnSpeed * Time.deltaTime);
                 *
                 *  }
                 * }
                 */
            }
            if (FreeMove)
            {
                forwardMovement  = transform.forward * Input.GetAxis("Vertical");
                sidewaysMovement = transform.right * Input.GetAxis("Horizontal");
                float cameraFacing = Camera.main.transform.eulerAngles.y;

                if (forwardMovement != Vector3.zero || sidewaysMovement != Vector3.zero)
                {
                    float angle = Mathf.Atan2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")) * Mathf.Rad2Deg;

                    animator.SetBool("Run", true);


                    transform.rotation  = Quaternion.AngleAxis(angle + cameraFacing, Vector3.up);
                    transform.position += transform.forward * 10.0f * Time.deltaTime;
                }
                else
                {
                    animator.SetBool("Run", false);
                }
            }

            if (Input.GetButtonDown("Dodge"))
            {
                combat.Dodge(forwardMovement, sidewaysMovement);
            }

            if (Input.GetButton("Block"))
            {
                combat.Block(true);
            }
            else
            {
                combat.Block(false);
            }



            if (Input.GetButtonDown("Interact"))
            {
                RaycastHit interact;
                Debug.DrawRay(transform.position, transform.TransformDirection(Vector3.forward) * 100.0f, Color.yellow);
                if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out interact, interactRange))
                {
                    if (interact.transform.gameObject.tag == "Item")
                    {
                        ItemContainer item = interact.transform.gameObject.GetComponent <ItemContainer>();
                        if (item.hitsToHarvest == 0)
                        {
                            inventory.AddItem(item.containedItem);
                            Destroy(interact.transform.gameObject);
                        }
                        else
                        {
                            animator.SetTrigger("AxeSwing");
                            item.hitsToHarvest -= 1;
                        }
                    }
                    if (interact.transform.gameObject.tag == "NPC")
                    {
                        if (canSpeak)
                        {
                            noDialogueTimer = 0.0f;
                            interact.transform.gameObject.GetComponent <DialogueContainer>().Talk();
                            SetDialogueMode();
                            return;
                        }
                    }
                    if (interact.transform.gameObject.tag == "Interactable")
                    {
                        Interactable interactable = interact.transform.gameObject.GetComponent <Interactable>();
                        Debug.Log("hit interact");
                        interactable.UseInteractable(gameObject);
                    }
                }
            }
            if (!canSpeak)
            {
                if (noDialogueTimer == dialogueTimeOut)
                {
                    dialogueTimeOut = +Time.deltaTime;
                }
                else
                {
                    noDialogueTimer = 0;
                    canSpeak        = true;
                }
            }

            break;

        case interactionState.Aiming:

            if (Input.GetAxisRaw("Aim") == 0)
            {
                bowDrawn = false;
                aiming   = false;
                FreeMove = true;
                currentInteractionState = interactionState.Normal;
            }
            else
            {
                crosshair.transform.LookAt(transform);
                aiming   = true;
                FreeMove = false;
                animator.SetBool("Run", false);

                Vector3 cameraDirection = new Vector3(playerCamera.transform.forward.x, 0f, playerCamera.transform.forward.z);
                Vector3 playerDirection = new Vector3(transform.forward.x, 0f, transform.forward.z);

                forwardMovement  = transform.forward * Input.GetAxis("Vertical");
                sidewaysMovement = transform.right * Input.GetAxis("Horizontal");


                Vector3 nextMovePos = (forwardMovement + sidewaysMovement) * Time.deltaTime * combat.currentMovementSpeed;



                transform.position += nextMovePos;


                if (Vector3.Angle(cameraDirection, playerDirection) > 0.5f)
                {
                    Quaternion targetRotation = Quaternion.LookRotation(cameraDirection, transform.up);

                    transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, turnSpeed * Time.deltaTime);
                }
                if (Input.GetAxis("PullBack") > 0)
                {
                    if (bowPowerModifer < maxBowPower)
                    {
                        bowPowerModifer += (Time.deltaTime * bowPullBackRate);
                    }
                    else
                    {
                        bowPowerModifer = maxBowPower;
                    }
                    bowDrawn = true;
                }

                if (bowDrawn == true)
                {
                    if (Input.GetAxisRaw("PullBack") == 0)
                    {
                        if (inventory.RemoveItem(arrow))
                        {
                            bowDrawn = false;

                            // GameObject arrow = Instantiate(arrowPrefab, bowPosition.position, playerCamera.transform.rotation);
                            GameObject arrow = ObjectPooler.PoolerInstance.GetPooledObject("Arrow");
                            arrow.SetActive(true);

                            arrow.transform.position = bowPosition.position;
                            arrow.transform.rotation = playerCamera.transform.rotation;
                            // GameObject arrow = Instantiate(arrowPrefab, bowPosition.position, playerCamera.transform.rotation);

                            Rigidbody arrowrb = arrow.GetComponent <Rigidbody>();
                            arrowrb.gameObject.GetComponent <Arrow>().damage = arrowDamage;
                            arrowrb.isKinematic = false;
                            arrowrb.AddForce(playerCamera.transform.forward * (shotForce + bowPowerModifer), ForceMode.Impulse);
                            arrow.GetComponent <Rigidbody>().AddForce(playerCamera.transform.forward * (shotForce + bowPowerModifer), ForceMode.Impulse);
                            bowPowerTimer   = 0;
                            bowPowerModifer = 0;
                        }
                    }
                }
            }


            break;

        case interactionState.DialogueMode:

            break;

        case interactionState.InventoryMode:
            if (Input.GetButtonDown("Inventory"))
            {
                SetInventoryMode(false);
            }

            break;

        case interactionState.CraftingMode:
            if (Input.GetButtonDown("Inventory"))
            {
                SetInventoryMode(false);
            }

            break;
        }
    }