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

public class PortalTeleporter : MonoBehaviour
{
    //public Transform player;
    [SerializeField] private PortalTeleporter linkedPortal;
    [SerializeField] private bool interScenePortal;
    [SerializeField] private string sceneName;
    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 && !interScenePortal)
        {
            DisablePortal();
        }
        else if (interScenePortal) 
        {
            _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);
            }
        }
        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)
    {
        if (interScenePortal)
        {
            if (other.tag == "Player")
            {
                SceneManager.LoadScene(sceneName);
            }
        }
        else
        {
            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;
        if (!interScenePortal)
        {
            linkedPortal._enabled = true;
            linkedPortal.vfx_gameobject.SetActive(true);
        }     
        vfx_gameobject.SetActive(true);
        audioSource.mute = false;
    }

    public void DisablePortal()
    {
        Debug.Log("disabled");
        _enabled = false;
        if (interScenePortal)
        {
            linkedPortal._enabled = false;
            linkedPortal.vfx_gameobject.SetActive(false);
        }
        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;
                if (!interScenePortal)
                {
                    linkedPortal._portalCanBeUsed = true;
                }  
            }
        }
        

    }
}