using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ItemGrabber : MonoBehaviour {
    public Transform CameraTransform;
    public Transform HandTransform;
    public Transform TorchHandTransform;
    public CanvasGroup PrimaryIndicator;
    public Text PrimaryText;
    public CanvasGroup SecondaryIndicator;
    public Text SecondaryText;
    public LayerMask ItemLayer;
    public LayerMask DroppingRaycastMask;
    public float Distance;
    public float ThrowVelocity;

    [Header("Prefabs")]
    public GameObject TorchPrefab;

    [Header("Runtime values")]
    public List<Item> GrabbedItems;
    public Torch Torch;

    private void Start() {
        PrimaryIndicator.alpha = 0;
        SecondaryIndicator.alpha = 0;
    }

    private void Update() {
        Item Item = null;
        Campfire Campfire = null;
        RaycastHit Hit;
        Vector3 From = CameraTransform.position;
        Vector3 Direction = CameraTransform.forward;

        if (Physics.Raycast(From, Direction, out Hit, Distance, ItemLayer) &&
                Hit.collider.attachedRigidbody != null) {
            Item = Hit.collider.attachedRigidbody.GetComponent<Item>();
        }

        if (Item != null && Input.GetButtonDown("Grab")) {
            Item.PickUp(HandTransform, new Vector3(Random.value - 0.5f, Random.value - 0.5f, Random.value - 0.5f) * 0.1f);
            GrabbedItems.Add(Item);
        }

        if (GrabbedItems.Count > 0) {
            if (Physics.Raycast(From, Direction, out Hit, Distance * 2f, 1 << LayerMask.NameToLayer("Campfire")) &&
                    Hit.collider.attachedRigidbody != null) {
                Campfire = Hit.collider.attachedRigidbody.GetComponent<Campfire>();
            }

            if (Campfire != null && Torch == null && Input.GetButtonDown("Ignite")) {
                Item GrabbedItem = GrabbedItems[0];
                GrabbedItems.RemoveAt(0);
                GameObject TorchObj = Instantiate(TorchPrefab, GrabbedItem.transform.position, GrabbedItem.transform.rotation, TorchHandTransform);
                Torch = TorchObj.GetComponent<Torch>();
                Destroy(GrabbedItem.gameObject);
            }

            if (Input.GetButtonDown("Grab") && Item == null) {
                Vector3 DropPosition;
                if (Campfire != null) {
                    DropPosition = Campfire.transform.position + Vector3.up * 0.7f;
                } else {
                    if (Physics.Raycast(From, Direction, out Hit, Distance * 2f, DroppingRaycastMask)) {
                        DropPosition = Hit.point + Hit.normal * 0.1f;
                    } else {
                        DropPosition = From + Direction * Distance;
                    }
                }
                GrabbedItems[0].Drop(DropPosition);
                GrabbedItems.RemoveAt(0);
            }
        }

        PrimaryIndicator.alpha = Mathf.Lerp(PrimaryIndicator.alpha, Item != null || Campfire != null ? 1 : 0, 10f * Time.deltaTime);
        if (Campfire != null && GrabbedItems.Count > 0) {
            PrimaryText.text = $"Burn {GrabbedItems[0].name.ToLower()}";
        } else if (Item != null) {
            PrimaryText.text = $"Take {Item.name.ToLower()}";
        }
        SecondaryIndicator.alpha = Mathf.Lerp(SecondaryIndicator.alpha, Campfire != null && GrabbedItems.Count > 0 && Torch == null ? 1 : 0, 10f * Time.deltaTime);
        if (GrabbedItems.Count > 0) {
            SecondaryText.text = $"Ignite {GrabbedItems[0].name.ToLower()}";
        }
    }
}
