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

public class PortalTeleporter : MonoBehaviour
{
    //public Transform player;
    [SerializeField] private PortalTeleporter linkedPortal;
    private Transform linkedPortalTransform;
    private float _portalCooldown = 2.5f;
    private bool _travellerIsOverlapping = false;
    private bool _portalCanBeUsed;
    private bool _enabled;
    private float _lastUsed;
    private bool _justUsed;
    private Transform traveller;
    public AudioClip TeleportSound;
    // poopy code, can be done much more efficient if this class is rewritten and attached to Portal parent object
    private AudioSource audioSource;
    private GameObject vfx_gameobject;

    private void Start()
    {
        if (linkedPortal == null)
        {
            DisablePortal();
        }
        else
        {
            linkedPortalTransform = linkedPortal.transform;
            _portalCanBeUsed = true;
            vfx_gameobject = transform.parent.Find("PortalFX").gameObject;
            audioSource = transform.parent.GetComponent<AudioSource>();
            audioSource.mute = true;
            if (_enabled)
            {
                vfx_gameobject.SetActive(true);
            }
            else
            {
                vfx_gameobject.SetActive(false);
            }
        } 
    }

    void OnTriggerEnter(Collider other)
    {
        traveller = other.gameObject.transform;
        Debug.Log(_enabled);
        if (_portalCanBeUsed && !_justUsed && _enabled)
        {
            if (other.name.StartsWith("Holster") || other.tag.Contains("Holster"))
            {
                Debug.Log("holster");
            }
            else
            {
                linkedPortal._portalCanBeUsed = false;
                _travellerIsOverlapping = true;
                if (other.tag == "Throwable")
                {
                    Debug.Log("Portal entered by throwable");
                    HandleThrowable();
                }
                else if (other.tag == "Player")
                {
                    Debug.Log("Portal entered by player");
                    HandlePlayer();
                }
            }
        }
    }

    // Enable/Disable portal if selected item is in a socket.
    public void EnablePortal() 
    {
        Debug.Log("enabled");
        _enabled = true;
        linkedPortal._enabled = true;
        vfx_gameobject.SetActive(true);
        linkedPortal.vfx_gameobject.SetActive(true);
        audioSource.mute = false;
    }

    public void DisablePortal()
    {
        Debug.Log("disabled");
        _enabled = false;
        linkedPortal._enabled = false;
        vfx_gameobject.SetActive(false);
        linkedPortal.vfx_gameobject.SetActive(false);
        audioSource.mute = true;
    }

    private void HandlePlayer()
    {
        Vector3 portalToTraveller = traveller.position - transform.position;
        float dotProduct = Vector3.Dot(transform.up, portalToTraveller);
        // If true player is on right side of portal
        if (dotProduct < 0f)
        {
            // teleport player
            float rotationDiff = -Quaternion.Angle(transform.rotation, linkedPortalTransform.rotation);
            rotationDiff += 180;
            traveller.Rotate(Vector3.up, rotationDiff);
            Vector3 positionOffset = Quaternion.Euler(0f, rotationDiff, 0f) * portalToTraveller;

            // Teleport
            traveller.position = linkedPortalTransform.position + positionOffset;

            AudioSource.PlayClipAtPoint(TeleportSound, traveller.position, 1);
            _travellerIsOverlapping = false;
            _portalCanBeUsed = false;
            _lastUsed = Time.time;
            _justUsed = true;
        }
    }

    private void HandleThrowable()
    {
        Vector3 portalToTraveller = traveller.position - transform.position;
        float dotProduct = Vector3.Dot(transform.up, portalToTraveller);
        // If true player is on right side of portal
        if (dotProduct < 0f)
        {
            // teleport player
            AudioSource.PlayClipAtPoint(TeleportSound, this.transform.position, 1);
            float rotationDiff = -Quaternion.Angle(transform.rotation, linkedPortalTransform.rotation);
            rotationDiff += 180;
            traveller.Rotate(Vector3.up, rotationDiff);
            Vector3 positionOffset = Quaternion.Euler(0f, rotationDiff, 0f) * portalToTraveller;
            traveller.position = linkedPortalTransform.position + positionOffset;
            _travellerIsOverlapping = false;
            _portalCanBeUsed = false;
            _lastUsed = Time.time;
            _justUsed = true;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.tag == "Player" || other.tag == "Throwable")
        {
            _travellerIsOverlapping = false;
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (_justUsed)
        {
            if (_lastUsed + _portalCooldown < Time.time)
            {
                _justUsed = false;
                _portalCanBeUsed = true;
                linkedPortal._portalCanBeUsed = true;
            }
        }
        

    }
}