﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using TMPro;
using Microsoft.MixedReality.Toolkit.Utilities.Solvers;

// MeasuringTape requires the GameObject to have a LineRenderer component
[RequireComponent(typeof(LineRenderer))]
public class MeasuringTape : MonoBehaviour
{
    public LineRenderer Beam;
    public Transform PointA;
    public Transform PointB;
    public Microsoft.MixedReality.Toolkit.UI.ToolTip distanceText;
    public bool isBeingPlaced;

    private double distance = 0;
    public double DistanceValue = 0;

    public bool inches;
    public bool feet;
    public bool meters;

    private void OnEnable()
    {
        if (distance == 0)
        {
            PointA.gameObject.SetActive(false);
            PointB.gameObject.SetActive(false);
            distanceText.gameObject.SetActive(false);
            Beam = this.GetComponent<LineRenderer>();
        }
    }

    [ContextMenu("Set Point A")]
    public void SetPointA()
    {
        PointA.gameObject.SetActive(true);
        PointB.gameObject.SetActive(false);
        PointB.position = new Vector3(PointA.position.x, PointA.position.y, PointA.position.z);
        PointB.transform.parent = PointA.transform;
        distanceText.gameObject.SetActive(false);
        Beam.enabled = false;
        PointA.GetComponent<TapToPlace>().StartPlacement();
        isBeingPlaced = true;

        Debug.Log("Set point A");
    }

    public void SetPointB()
    {
        if (isBeingPlaced)
        {
            PointB.gameObject.SetActive(true);
            PointB.transform.parent = this.transform;
            distanceText.gameObject.SetActive(true);
            Beam.enabled = true;
            PointB.GetComponent<TapToPlace>().StartPlacement();

            Debug.Log("Set point B");
        }
    }

    public void StopBeingPlaced()
    {
        isBeingPlaced = false;
    }

    public void StartBeingPlaced()
    {
        isBeingPlaced = true;
    }

    public void MeasureDistance()
    {
        Beam.SetPosition(0, PointA.position);
        Beam.SetPosition(1, PointB.position);

        distance = Vector3.Distance(PointA.position, PointB.position);

        //DistanceText.gameObject.transform.localPosition = (PointA.localPosition + PointB.localPosition)/2;
        distanceText.gameObject.transform.localPosition = new Vector3(PointB.localPosition.x, PointB.localPosition.y + 0.075f, PointB.localPosition.z);
        distanceText.transform.position = PointB.transform.position;

        if (inches)
        {
            distanceText.ToolTipText = (distance * 39.37007874).ToString("F2") + "in";
            DistanceValue = distance * 39.37007874;
        }
        if (feet)
        {
            distanceText.ToolTipText = (distance * 3.28084).ToString("F2") + "ft";
            DistanceValue = distance * 3.28084;
        }
        if (meters)
        {
            distanceText.ToolTipText = distance.ToString("F2") + "m";
            DistanceValue = distance;
        }
    }

    private void SetAllFalse()
    {
        inches = false;
        feet = false;
        meters = false;
    }

    public void SetInches()
    {
        SetAllFalse();
        inches = true;
        SetPointA();
    }

    public void SetFeet()
    {
        SetAllFalse();
        feet = true;
        SetPointA();
    }

    public void SetMeters()
    {
        SetAllFalse();
        meters = true;
        SetPointA();
    }

    private void Update()
    {
        MeasureDistance();
    }
}
