using System.Collections.Generic;
using UnityEngine;

// Kann sein das das nur für statische Objekte funktioniert
public class DimShiftBlockable : MonoBehaviour
{
    private GameObject dim1;
    private GameObject dim2;
    
    private LinkedList<GameObject> collisions = new LinkedList<GameObject>();
    
    AudioReverbFilter Rev1;
    AudioLowPassFilter lpf;
    GameObject Dim1;
    GameObject Dim2;
    
    private Animator animator;

    void Start()
    {
        dim1 = GameObject.Find("Dim1");
        dim2 = GameObject.Find("Dim2");
        
        dim1.SetActive(true);
        dim2.SetActive(false);
        
        Rev1 = GameObject.Find("AudioController").GetComponent<AudioReverbFilter>();
        lpf = GameObject.Find("AudioController").GetComponent<AudioLowPassFilter>();
        
        Rev1.enabled = false;
        lpf.enabled = false;
        
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.LeftShift) && CanSwitchDims())
        { // CanSwitchDims ist rel. "teuer", wird aber nur ausgeführt wenn die erste condition true ergibt
            animator.SetTrigger("ShiftsDim");
            ChangeDim();
            MusicSwitch();
        }
    }

    bool CanSwitchDims()
    {
        // eine "günstigere" methode ist mir nicht eingefallen
        // sollte aber in betracht der länge der liste kein problem sein
        foreach (var collision in collisions)
        {
            if (collision.tag.Equals("DimShiftBlocker")) { return false; }
        }

        // falls kein dimension shift blocker unter den kollisionen ist, dann yallah abfahrt
        return true;
    }
    
    void ChangeDim()
    {
        // invertiert den aktuellen active state der dimensionen
        // spart die ganzen if statements
        dim1.SetActive(!dim1.activeSelf);
        dim2.SetActive(!dim2.activeSelf);
    }
    
    void MusicSwitch()
    {
        Rev1.enabled = !Rev1.enabled;
        lpf.enabled = !lpf.enabled;
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        // addFirst weil on exit die verlassene collision im average case schneller gefunden wird
        collisions.AddFirst(other.gameObject);
    }

    private void OnTriggerExit2D(Collider2D other)
    {
        collisions.Remove(other.gameObject);
    }
}
