﻿using System.Collections;
using UnityEngine;
using UnityEngine.Events;
public class AnimatedSwitch : MonoBehaviour {
    // Events die ausgeführt werden, wenn der Schalter nach oben geschaltet wird
    public UnityEvent upEvents;
    // Events die ausgeführt werden, wenn der Schalter nach unten geschaktet wird
    public UnityEvent downEvents;
    // Audio Datei beim schalten
    public AudioClip sfxSwitch;
    // Der aktuelle Zustand
    private bool isCurrentlyDown = false;
    // Referenz auf den Hebel, damit dieser animiert werden kann
    public Transform handle;
    // Ist der Hebel gerade in einer Animation?
    private bool isSwitching;
    // Schaltet ein oder aus. Sollte von dem Interactable Component aufgerufen werden
    public void Toggle()
    {
        if (!isSwitching)
        {
            isCurrentlyDown = !isCurrentlyDown;
            StartCoroutine(SwitchAnimation());
        }
    }
    private IEnumerator SwitchAnimation()
    {
        isSwitching = true;
        AudioSource.PlayClipAtPoint(sfxSwitch, transform.position, 0.8f); // Sound Effekt
        // Drehe den Hebel um 60°, wenn er geschaltet wird
        Vector3 startRotation = handle.localEulerAngles;
        float targetRotation = startRotation.z + (isCurrentlyDown ? 60 : -60);
        // t = Time
        for (float t = 0; t <= 1; t += Time.deltaTime)
        {
            // Lineare Interpolation:  startRotation + t * (targetRotation-startRotation)
            // Wechselt flüssig zwischen Start- und Target-Rotation, wenn t zwischen 0 und 1 ist.
            float newRotation = Mathf.Lerp(startRotation.z, targetRotation, t);
            handle.localEulerAngles = new Vector3(startRotation.x, startRotation.y, newRotation);
            yield return null;
        }
        // Rufe das passende Event auf
        if (isCurrentlyDown) {
            downEvents.Invoke();
        } else {
            upEvents.Invoke();
        }
        isSwitching  = false;
    }
}
