using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.InputSystem.EnhancedTouch;
using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;

public class TouchVisualizer : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI startPositionText;
    [SerializeField] private TextMeshProUGUI currentPositionText;
    [SerializeField] private GameObject startSprite;
    [SerializeField] private GameObject endSprite;
    [SerializeField] private GameObject lineRendererObject;
    [SerializeField] private int fingerIndex;

    private LineRenderer lineRenderer;
    private bool isTouching;
    private Plane xyPlane;
    private Finger currentFinger;

    private void Awake()
    {
        // We need to call EnhancedTouchSupport.Enable() to use the EnhancedTouch.Touch API.
        EnhancedTouchSupport.Enable();
    }

    void Start()
    {
        xyPlane = new Plane(Vector3.forward, Vector3.zero);
        lineRenderer = lineRendererObject.GetComponent<LineRenderer>();

        // We assume the user is not touching the screen at the start
        isTouching = false;
        DisableVisuals();
    }

    // Connect Touch events to functions inside this class
    private void OnEnable()
    {
        Touch.onFingerDown += OnFingerDown;
        Touch.onFingerUp += OnFingerUp;
    }

    // Remove links to Touch events when this class is disabled
    private void OnDisable()
    {
        Touch.onFingerDown -= OnFingerDown;
        Touch.onFingerUp -= OnFingerUp;
    }

    public void OnFingerDown(Finger finger)
    {
        if (finger.index == fingerIndex)
        {
            currentFinger = finger;
            isTouching = true;
            EnableVisuals();
        }
    }

    public void OnFingerUp(Finger finger)
    {
        if (finger.index == fingerIndex)
        {
            isTouching = false;
            DisableVisuals();
        }
    }

    private void EnableVisuals()
    {
        startSprite.SetActive(true);
        endSprite.SetActive(true);
        lineRendererObject.SetActive(true);
    }

    private void DisableVisuals()
    {
        startPositionText.text = "Touch The Screen";
        currentPositionText.text = "Touch The Screen";
        startSprite.SetActive(false);
        endSprite.SetActive(false);
        lineRendererObject.SetActive(false);
    }

    void Update()
    {
        if (isTouching)
        {
            // Gather touch data from the current finger
            Touch touch = currentFinger.currentTouch;
            Vector2 startPosition = touch.startScreenPosition;
            Vector2 currentPosition = touch.screenPosition;

            // Set text
            startPositionText.text = $"Start Position: {startPosition}";
            currentPositionText.text = $"Current Position: {currentPosition}";

            // Update positions of sprites and lines
            Vector3 startWorldPosition = TouchUtilities.GetTouchPositionOnPlane(xyPlane, startPosition);
            Vector3 currentWorldPosition = TouchUtilities.GetTouchPositionOnPlane(xyPlane, currentPosition);
            startSprite.transform.position = startWorldPosition;
            endSprite.transform.position = currentWorldPosition;
            lineRenderer.SetPosition(0, startWorldPosition);
            lineRenderer.SetPosition(1, currentWorldPosition);
        }
    }
}